读书人

这个程序为什么不会死锁很郁闷!问哪

发布时间: 2012-02-27 10:00:22 作者: rapoo

这个程序为什么不会死锁,很郁闷!问谁能解答.
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

读书人网 >J2SE开发

热点推荐