这个程序为什么不会死锁,很郁闷!问谁能解答.
class DeadTest implements Runnable{
public int flag = 1;
static Object a = new Object();
static Object b = new Object();
public void run(){
System.out.println( "===flag is === " + flag);
if(flag == 1){
synchronized(a){
try{
Thread.sleep(1000);
}catch(InterruptedException e){
e.printStackTrace();
}
}
synchronized(b){
System.out.println(1);
}
}
else {
synchronized(b){
try{
Thread.sleep(1000);
}catch(InterruptedException e){
e.printStackTrace();
}
}
synchronized(a){
System.out.println(0);
}
}
}
}
public class TestSyn{
public static void main(String[] args){
DeadTest t1 = new DeadTest();
DeadTest t2 = new DeadTest();
t1.flag=1;
t2.flag=0;
Thread m = new Thread(t1);
Thread n = new Thread(t2);
m.start();
m.yield();
n.start();
}
}
------解决方案--------------------m.yield();是释放了m线程的运行权,但是不保证调度机制再次调度m,在这里有两种情况1,线程m执行在a同步块的时候,n.start(),n进入b同步块,所以m线程不会进入System.out.print(1)这条语句执行,直到n线程走出b同步块,这样输出是0,1.第二种就是线程m执行到b同步块时,n.start()这样输出结果就是1,0 ,不会有死锁的情况.我的机器上0,1出现的几率大1,0