线程同步(synchronized)
1)如果一个类有两个synchronized修饰的方法,如果有两个该类的对象分别执行这两个方法,每个方法中线程都适当随机休眠,那么结果会是如何:
package com.medivh.thread;
public class ThreadTest4
{
public static void main(String[] args)
{
A a = new A();
Thread t1 = new A1(a);
a = new A();
Thread t2 = new A2(a);
t1.start();
t2.start();
}
}
class A
{
public synchronized void test()
{
for(int i = 0; i < 10; i++)
{
try
{
Thread.sleep((long)(Math.random() * 1000));
}
catch (InterruptedException e)
{
e.printStackTrace();
}
System.out.println("A1: " + i);
}
}
public synchronized void test2()
{
for(int i = 0; i < 10; i++)
{
try
{
Thread.sleep((long)(Math.random() * 1000));
}
catch (InterruptedException e)
{
e.printStackTrace();
}
System.out.println("A2: " + i);
}
}
}
class A1 extends Thread
{
private A a;
public A1(A a)
{
this.a = a;
}
public void run()
{
this.a.test();
}
}
class A2 extends Thread
{
private A a;
public A2(A a)
{
this.a = a;
}
@Override
public void run()
{
this.a.test2();
}
}
测试结果:
A2: 0
A1: 0
A2: 1
A1: 1
A2: 2
A2: 3
A2: 4
A1: 2
A2: 5
A1: 3
A2: 6
A2: 7
A2: 8
A1: 4
A2: 9
A1: 5
A1: 6
A1: 7
A1: 8
A1: 9
结果乱序,你休眠我运行,我休眠,你再运行。
2)如果上述方法中第一个方法无休眠操作,先执行第一个方法。同样是两个对象。
package com.medivh.thread;
public class ThreadTest4
{
public static void main(String[] args)
{
A a = new A();
Thread t1 = new A1(a);
a = new A();
Thread t2 = new A2(a);
t1.start();
t2.start();
}
}
class A
{
public synchronized void test()
{
for(int i = 0; i < 10; i++)
{
// try
// {
// Thread.sleep((long)(Math.random() * 1000));
// }
// catch (InterruptedException e)
// {
// e.printStackTrace();
// }
System.out.println("A1: " + i);
}
}
public synchronized void test2()
{
for(int i = 0; i < 10; i++)
{
try
{
Thread.sleep((long)(Math.random() * 1000));
}
catch (InterruptedException e)
{
e.printStackTrace();
}
System.out.println("A2: " + i);
}
}
}
class A1 extends Thread
{
private A a;
public A1(A a)
{
this.a = a;
}
public void run()
{
this.a.test();
}
}
class A2 extends Thread
{
private A a;
public A2(A a)
{
this.a = a;
}
@Override
public void run()
{
this.a.test2();
}
}
测试结果:
A1: 0
A1: 1
A1: 2
A1: 3
A1: 4
A1: 5
A1: 6
A1: 7
A1: 8
A1: 9
A2: 0
A2: 1
A2: 2
A2: 3
A2: 4
A2: 5
A2: 6
A2: 7
A2: 8
A2: 9
先执行我,我不休眠,你休想运行。
3)第一个方法休眠,第二个不休眠,依然先执行第一个方法,同样是两个对象。
package com.medivh.thread;
public class ThreadTest4
{
public static void main(String[] args)
{
A a = new A();
Thread t1 = new A1(a);
a = new A();
Thread t2 = new A2(a);
t1.start();
t2.start();
}
}
class A
{
public synchronized void test()
{
for(int i = 0; i < 10; i++)
{
try
{
Thread.sleep((long)(Math.random() * 1000));
}
catch (InterruptedException e)
{
e.printStackTrace();
}
System.out.println("A1: " + i);
}
}
public synchronized void test2()
{
for(int i = 0; i < 10; i++)
{
// try
// {
// Thread.sleep((long)(Math.random() * 1000));
// }
// catch (InterruptedException e)
// {
// e.printStackTrace();
// }
System.out.println("A2: " + i);
}
}
}
class A1 extends Thread
{
private A a;
public A1(A a)
{
this.a = a;
}
public void run()
{
this.a.test();
}
}
class A2 extends Thread
{
private A a;
public A2(A a)
{
this.a = a;
}
@Override
public void run()
{
this.a.test2();
}
}
运行结果:
A2: 0
A2: 1
A2: 2
A2: 3
A2: 4
A2: 5
A2: 6
A2: 7
A2: 8
A2: 9
A1: 0
A1: 1
A1: 2
A1: 3
A1: 4
A1: 5
A1: 6
A1: 7
A1: 8
A1: 9
不好意思,你刚运行还没出结果就休眠了,那么轮到我了,我不休眠,打印完所有结果,你再继续吧。
4)两个方法都有休眠,但是只有一个对象。
package com.medivh.thread;
public class ThreadTest4
{
public static void main(String[] args)
{
A a = new A();
Thread t1 = new A1(a);
//a = new A();
Thread t2 = new A2(a);
t1.start();
t2.start();
}
}
class A
{
public synchronized void test()
{
for(int i = 0; i < 10; i++)
{
try
{
Thread.sleep((long)(Math.random() * 1000));
}
catch (InterruptedException e)
{
e.printStackTrace();
}
System.out.println("A1: " + i);
}
}
public synchronized void test2()
{
for(int i = 0; i < 10; i++)
{
try
{
Thread.sleep((long)(Math.random() * 1000));
}
catch (InterruptedException e)
{
e.printStackTrace();
}
System.out.println("A2: " + i);
}
}
}
class A1 extends Thread
{
private A a;
public A1(A a)
{
this.a = a;
}
public void run()
{
this.a.test();
}
}
class A2 extends Thread
{
private A a;
public A2(A a)
{
this.a = a;
}
@Override
public void run()
{
this.a.test2();
}
}
程序结果:
A1: 0
A1: 1
A1: 2
A1: 3
A1: 4
A1: 5
A1: 6
A1: 7
A1: 8
A1: 9
A2: 0
A2: 1
A2: 2
A2: 3
A2: 4
A2: 5
A2: 6
A2: 7
A2: 8
A2: 9
synchronized老板说我必须先干完一件事再去干另外一件,不好意思,我不能分身啊。
5)两个方法都休眠,蛋第一个方法为静态的
package com.medivh.thread;
public class ThreadTest4
{
public static void main(String[] args)
{
A a = new A();
Thread t1 = new A1(a);
//a = new A();
Thread t2 = new A2(a);
t1.start();
t2.start();
}
}
class A
{
public synchronized static void test()
{
for(int i = 0; i < 10; i++)
{
try
{
Thread.sleep((long)(Math.random() * 1000));
}
catch (InterruptedException e)
{
e.printStackTrace();
}
System.out.println("A1: " + i);
}
}
public synchronized void test2()
{
for(int i = 0; i < 10; i++)
{
try
{
Thread.sleep((long)(Math.random() * 1000));
}
catch (InterruptedException e)
{
e.printStackTrace();
}
System.out.println("A2: " + i);
}
}
}
class A1 extends Thread
{
private A a;
public A1(A a)
{
this.a = a;
}
public void run()
{
A.test();//this.a.test();
}
}
class A2 extends Thread
{
private A a;
public A2(A a)
{
this.a = a;
}
@Override
public void run()
{
this.a.test2();
}
}
运行结果:
A2: 0
A1: 0
A1: 1
A2: 1
A2: 2
A1: 2
A2: 3
A2: 4
A1: 3
A2: 5
A1: 4
A1: 5
A1: 6
A2: 6
A2: 7
A1: 7
A1: 8
A2: 8
A2: 9
A1: 9
对不起,我有这个方法,但是我领导现在要直接控制我的那个权力,我还是管好我自己能管得,那个权力,领导爱干嘛干嘛。
6)两个方法都是静态的
package com.medivh.thread;
public class ThreadTest4
{
public static void main(String[] args)
{
A a = new A();
Thread t1 = new A1(a);
//a = new A();
Thread t2 = new A2(a);
t1.start();
t2.start();
}
}
class A
{
public synchronized static void test()
{
for(int i = 0; i < 10; i++)
{
try
{
Thread.sleep((long)(Math.random() * 1000));
}
catch (InterruptedException e)
{
e.printStackTrace();
}
System.out.println("A1: " + i);
}
}
public synchronized static void test2()
{
for(int i = 0; i < 10; i++)
{
try
{
Thread.sleep((long)(Math.random() * 1000));
}
catch (InterruptedException e)
{
e.printStackTrace();
}
System.out.println("A2: " + i);
}
}
}
class A1 extends Thread
{
private A a;
public A1(A a)
{
this.a = a;
}
public void run()
{
A.test();//this.a.test();
}
}
class A2 extends Thread
{
private A a;
public A2(A a)
{
this.a = a;
}
@Override
public void run()
{
A.test2();//this.a.test2();
}
}
运行结果:
A1: 0
A1: 1
A1: 2
A1: 3
A1: 4
A1: 5
A1: 6
A1: 7
A1: 8
A1: 9
A2: 0
A2: 1
A2: 2
A2: 3
A2: 4
A2: 5
A2: 6
A2: 7
A2: 8
A2: 9
好吧,好吧,我被革职了,我的领导现在在管理我以前的东西。这些都是别人的,而且属于同一个人的。

浙公网安备 33010602011771号