| 用static  类加载的时候就会创建对象,所以r和r1用的是同一个锁,但是因为锁的顺序不一样,当t1线程进入锁里面(o1),那到第一个锁而没有进入第二个锁的时候,t2线程也运行了,而且也能进入到第一个锁里面(o2) 而当t2进入到第二个锁(o1)里面的时候里面有t1,所以就进不去,当t1要进入到第二个锁(o2)里面的时候,里面有t2 所以t1获取不到第二个锁所以会出现死锁!你可以把锁的顺序调一致。而不用static 的话,t1和t2用的都不是同一个锁  也就是t1的o1,o2和t2的o1,o2 是四个不同的对象!这样写加不加static都不会出现死锁 package cn.other.java.test;
 
 public class Rescore implements Runnable {
 int flag = 1;
 static Object o1 = new Object() ,o2  = new Object();   //static Object o1 = new Object() ,o2  = new Object(); ,程序死锁,不用static程序可运行结束
 
 public void run()
 {
 
 if(flag==1)
 {
 synchronized(o1)
 {
 try {
 Thread.sleep(1000);
 } catch (InterruptedException e) {
 // TODO Auto-generated catch block
 e.printStackTrace();
 }
 
 synchronized(o2)
 {
 for(int i = 0;i<10;i++)
 {
 System.out.println("flag=" + flag);
 }
 }
 }
 }
 if(flag==0)
 {
 synchronized(o1)
 {
 try {
 Thread.sleep(1000);
 } catch (InterruptedException e) {
 // TODO Auto-generated catch block
 e.printStackTrace();
 }
 
 synchronized(o2)
 {
 for(int i = 0;i<10;i++)
 {
 System.out.println("flag=" + flag);
 }
 }
 }
 }
 
 
 }
 
 }
 
 |