付鹏 发表于 2012-3-18 00:55
是两个对象 === 那 static Object obj1 = new Object();
stati ...
是的,要么你就创建一个锁 要么就搞两个static的锁 才能搞成死锁的作者: 梁锡伟 时间: 2012-3-18 01:00
Thread a = new Thread(new xiancheng(true));
Thread b = new Thread(new xiancheng(false));
每new一个线程就有1个obj1和obj2,一共四个,懂? 作者: 彭盼 时间: 2012-3-18 01:27
Object obj1 = new Object();
Object obj2 = new Object();
public static void main(String[] args) {
DeadLock d1 = new DeadLock();
DeadLock d2 = new DeadLock();
d1.flag = 1;
d2.flag = 2;
Thread t1 = new Thread(d1);
Thread t2 = new Thread(d2);
t1.start();
t2.start();
}
这里如果不为static,当然就创建了多个副本啊。
因为如果不为static,当执行完以下两行时:
DeadLock d1 = new DeadLock();
DeadLock d2 = new DeadLock();
内存里会有d1、d2两个DeadLock对象,每个DeadLock对象中会有obj1、obj2两个Object,这点很重要!即内存中对象如下:
d1:{obj1,obj2,flag}
d2:{obj1,obj2,flag}
设置完flag以后,变成:
d1:{obj1,obj2,flag==1}
d2:{obj1,obj2,flag==2}
现在,进行t1.start()的时候,会相继锁d1.obj1,再锁d1.obj2最后System.out.println("my name is t1");进行t2.start()的时候,会相继锁t2.obj1,再锁t2.obj2最后System.out.println("my name is t2")。所以完全不会存在死锁的问题。