下面的代码是一个简单的死锁问题  
如果把Object对象前的static去掉  则死锁问题就不存在了 
即把“static Object o1 = new Object(),o2 = new Object();”改为
“Object o1 = new Object(),o2 = new Object();”后 就不存在死锁问题了 
请问哪位大虾知道为什么吗 ... ? 谢谢 public class DeadLock { /**
 * @param args
 */
public static void main(String[] args) {
// TODO Auto-generated method stub
          runLock r1 = new runLock();
          runLock r2 = new runLock();
          Thread t1 = new Thread(r1);
          Thread t2 = new Thread(r2);
          r1.flag = 0;
          r2.flag = 1;
          t1.start();
          t2.start();
}}
 class runLock implements Runnable
{

int flag = 0;
static Object o1 = new Object(),o2 = new Object();
public void run() {
        System.out.println("flag = " + flag);

        if(flag == 0)
        {
          synchronized(o1)
          {
           try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
         synchronized(o2)
          {
           System.out.println("flag ===0 Thread...");
          }
          }
 
        }
        
        if(flag == 1)
        {
          synchronized(o2)
          {
           try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
          synchronized(o1)
          {
           System.out.println("flag ===1 Thread...");
          }
          }        }     

}

}

解决方案 »

  1.   

    声明为static的变量不属于这个类,所以对于r1和r2来说,o1和o2是两个相同的对象,你这样加锁当然死掉了。加锁应该按照约定的顺序,例如在程序里约定先对o1加锁再对o2加锁声明去掉static后o1和o2是成员变量,也就是说r1.o1和r2.o1是两个不同的对象,o2也是,按照你现在加锁的方式根本是没有影响的
      

  2.   

    static变量是可以线程之间共享的,二non-static不行。
      

  3.   

    1楼的解释是对于r1和r2来说 o1是相同的对象 因为是static修饰 在内存中的静态区 同一块位置 而非静态属性是属于不同的类实例的 所以是不同的位置 
    2楼的解释更直接
    一般来说 用同步是用在类里面的某个需要同步的方法而不是用在对象上
      

  4.   

    应该是o1或者o2对象,只要有一个不声明为static的话,就不存在死锁问题吧。