刚开始学习java  敲程序时的一个小失误发现该死锁程序的一个疑问 注释的两行是我误打的 缺了static修饰对象就不会产生死锁  求高手解答为什么~~~~ 代码如下  
public class TestDeadLock implements Runnable
{
public int flag = 1;
// Object o1 = new Object();
// Object o2 = new Object();
static Object o1 = new Object();
static Object o2 = new Object();
public void run() {
System.out.println("flag:" + flag);
if(flag == 1) {
synchronized(o1) {
try
{
Thread.sleep(500);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
synchronized(o2) {
System.out.println("1");
}
}
}
if(flag ==0) {
synchronized(o2) {
try
{
Thread.sleep(500);
}
catch (InterruptedException a)
{
a.printStackTrace();
}
synchronized(o1) {
System.out.println("0");
}
}
}
} public static void main(String[] args) {
TestDeadLock td1 = new TestDeadLock();
TestDeadLock td2 = new TestDeadLock();
td1.flag = 1;
td2.flag = 0;
Thread t1 = new Thread(td1);
Thread t2 = new Thread(td2);
t1.start();
t2.start();
}
}

解决方案 »

  1.   

    synchronize关键字加锁在static 修饰的对象上 相当于给该类加锁 整个类都加锁你明白吧? 其实就是给他生成的Class类型实例加锁。o1 o2 都是该类的实例,所以会死锁   而加载无static 的关键字上就是给对象枷锁,所以 你把它加到o1 o2两个对象上当然不会产生死锁
      

  2.   

    不用static ,t1内有o1、o2,t2内也有o1、o2,是4个实例,他们之间没有任何关系,所以不会有锁。如果是静态的,那么t1和t2内的这两个对象都是相同的,也就是说只有2个实例,所以交叉引用会出现锁。
      

  3.   

    static 是静态全局共享的
    你加个锁一点意义都没有
      

  4.   

    你测试的时候只实例化一个TestDeadLock,然后传出Thread的构造方法,并启动线程,就无所谓static不static了。
      

  5.   


    是静态的无论怎么new都只有那一个这个道理吧?我貌似明白点了  嘿嘿
      

  6.   

    static synchronized method:需要得到这个类的Class object的锁。一个类只有一个这样的锁(同一个classloader里面)。
    instance synchronized method:需要得到这个instance object的锁。不同的instance有不同的锁。
    而类的锁和intance的锁并没有任何关系,也就是说,调用一个类的static synchronized method并不会block住instance synchronized method的调用,反之亦然。
      

  7.   


    你这个锁相当于加在 Object 这个 类型的 类变量上 ,你找本java 编程思想 写的很详细了 ~