日期:2014-05-20  浏览次数:20798 次

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