public class TestDeadLock implements Runnable{
  public int flag=1;
  static Object o1=new Object(),o2=new Object();
  public void run(){
  
    System.out.println("flag ="+flag);
if(flag==1){
   synchronized(o1){
       try{
     Thread.sleep(500);   
   }
   catch(Exception e){
    e.printStackTrace();    
   }
 synchronized(o2){ 
 System.out.println("o2 DeadLock");
}    
   }   
}  
   if(flag==0){
  synchronized(o2){
   try{
 Thread.sleep(500);   
   }
   catch(Exception e){
e.printStackTrace();    
   }
  synchronized(o1){ 
 System.out.println("o2 DeadLock");
 }
   
   }

      } 
}
  public static void main(String[] args){
TestDeadLock test1=new TestDeadLock();
TestDeadLock test2=new TestDeadLock();
test1.flag=1;
test2.flag=0;
Thread t1=new Thread(test1);
Thread t2=new Thread(test2);
t1.start();
t2.start();  
  }
}

  为什么 程序会死锁啊
          TestDeadLock test1=new TestDeadLock();
TestDeadLock test2=new TestDeadLock();
  这两个 new 出来  在内存中的 分布 是不是这样的啊  
  

解决方案 »

  1.   

    你可以假设test1和test2这两个对象启动的线程中的任何一个先得到执行机会,这里假设是test2启动的线程
    因为test2的flag被置为0,进入if(flag==0)的那个同步块,获得o2的锁,然后睡眠500ms,这么长的时候test1启动的线程早就获得执行的机会了,进入对应的同步块获得o1的锁,然后睡眠500ms~~过了500ms醒来,一个需要o1的锁才能继续往下执行,一个需要o2的锁才能继续往下执行,但各自此时都无法释放相应的锁给对方,就互相等待着,进入死锁~~~test1启动的线程先执行的话做类似分析~~
      

  2.   

    2.同步块,示例代码如下:public void method(SomeObject so) {   
    synchronized(so)   
    {   
           //…..   
    }   
    }   
    这时,锁就是so这个对象,谁拿到这个锁谁就能够运行他所控制的那段代码。当有一个明确的对象作为锁时,就能够这样写程式,但当没有明确的对象作为锁,只是想让一段代码同步时,能够创建一个特别的instance变量(他得是个对象)来充当锁:
      

  3.   

    因为这个里的两个object都是static,所以test1.o1就是test2.o1;test1.o2就是test2.o2。