class TestDeadLock implements Runnable{
static Object o1 = new Object(),o2 = new Object();
int flag = 0;
public static void main(String[] args){
TestDeadLock d1 = new TestDeadLock();
TestDeadLock d2 = new TestDeadLock();
d1.flag = 0;
d2.flag = 1;
Thread t1 = new Thread(d1);
Thread t2 = new Thread(d2);
t1.start();
t2.start();
}

public void run(){

System.out.println("flag" + flag);
if(flag == 0){
synchronized(o1){
try{
System.out.println(0);
Thread.sleep(500);
}
catch(InterruptedException e){
System.out.println(e);
}
synchronized(o2){
System.out.println("100");
}
}
}
if(flag == 1){
synchronized(o2){
try{
System.out.println(1);
Thread.sleep(500);
}
catch(InterruptedException e){
System.out.println(e);
}
synchronized(o1){
System.out.println("100");
}
}
}
}
}
为什么static Object o1 = new Object(),o2 = new Object()跟不加static的结果不一样呢?这两种情况怎么分析?

解决方案 »

  1.   

    加了static的表示这个类的所有实例共享它。不加的表示所有实例各自有一个该属性成员,且各个实例之间的互不影响。
      

  2.   


    class TestDeadLock implements Runnable{
    static Object o1 = new Object(),o2 = new Object();
    int flag = 0;
    public static void main(String[] args){
    TestDeadLock d1 = new TestDeadLock();
    TestDeadLock d2 = new TestDeadLock();
    d1.flag = 0;
    d2.flag = 1;
    Thread t1 = new Thread(d1);
    Thread t2 = new Thread(d2);
    t1.start();
    t2.start();
    }public void run(){System.out.println("flag" + flag);
    if(flag == 0){
    synchronized(o1){
    try{
    System.out.println(0);
    Thread.sleep(500);
    }
    catch(InterruptedException e){
    System.out.println(e);
    }
    synchronized(o2){
    System.out.println("100");
    }
    }
    }
    if(flag == 1){
    synchronized(o2){
    try{
    System.out.println(1);
    Thread.sleep(500);
    }
    catch(InterruptedException e){
    System.out.println(e);
    }
    synchronized(o1){
    System.out.println("100");
    }
    }
    }
    }
    }以后发代码  就这样发...
      

  3.   

    TestDeadLock d1 = new TestDeadLock();
    TestDeadLock d2 = new TestDeadLock();
    如果是static的话。上面两句其实只生成了一个o1与一个o2.
    如果不用static的话。就会生成两个o1与两个o2.
    类中的static 变量与方法。在类进行加载的时候就会生成。并且只会创建一次。
      

  4.   

    static Object o1 = new Object(),o2 = new Object()
    o1,o2在TestDeadLock类加载的时候就存在了
    而且,TestDeadLock d1,d2用的是同一个o1,o2,因为o1,o2为static变量,
    synchronized(o1)是对o1加锁了,使得o1不能被别的方法调用了
    我们可以认为Thread t1,t2同时开始,注意flag不是static,是d1,d2各自的,分别为0,1,
    所以t1,t2进run方法后执行的不是同一个if,而且一进去就把o1,o2给锁了,这个时候o1,o2都被锁了
    if(flag==0)里面,Thread.sleep(500)确保了执行到synchronized(o2)的时候,o2已经被另一个线程给锁了,于是synchronized(o2)等待另一个线程给o2解锁
    if(flag==1)里面,Thread.sleep(500)确保了执行到synchronized(o1)的时候,o1已经被另一个线程给锁了,于是synchronized(o1)等待另一个线程给o1解锁
    于是死锁的条件,2个线程相互等待的情形形成,死锁了,程序结束不了了而没有static,说明TestDeadLock d1,d2用的是不同的o1,o2,
    t1先锁了d1.o1,t2先锁了d2.o2,t1再要锁d1.o2,t2再要锁d2.o1,这个时候d1.o2,d2.o1都没被锁,程序顺利执行下去,2个线程结束程序就结束了