黑马程序员技术交流社区
标题:
关于死锁的一个问题
[打印本页]
作者:
李东城
时间:
2013-2-13 17:15
标题:
关于死锁的一个问题
public class DeadLockTest {
public static void main(String[] args) {
Thread t1 = new Thread(new Test(true));
Thread t2 = new Thread(new Test(false));
t1.start();
t2.start();
}
}
class MyLock
{
//static MyLock lock1=new MyLock();
//static MyLock lock2=new MyLock();
}
class Test implements Runnable {
MyLock lock1=new MyLock();//加static就会死锁
MyLock lock2=new MyLock();//加static就会死锁
private boolean flag;
Object obj1 = new Object();
Object obj2 = new Object();
public Test(boolean flag) {
this.flag = flag;
}
public void run() {
if (flag) {
while (true) {
synchronized (lock1) {
System.out.println("if lock1");
synchronized (lock2) {
System.out.println("if lock2");
}
}
}
} else {
while (true) {
synchronized (lock2) {
System.out.println("else lock2");
synchronized (lock1) {
System.out.println("else lock1");
}
}
}
}
}
}
复制代码
我想问一下以上程序为什么在注释处加static才会产生死锁,不加static为什么不会产生死锁现象?
作者:
许鑫星
时间:
2013-2-13 18:09
因为你在主线程中创建了两个Test 没有static的话,相当于有4个锁,两个循环中的lock1并不是一个类,每个同步块一个不同的锁,就不会产生死锁。
如果加上static 两个lock在所有Test中只存在两个,这样同步块中嵌套了另一个锁的同步块,就会死锁。
作者:
铿锵科技
时间:
2013-2-13 19:26
在开发时是为了避免死锁,你这样是做什么用的?明确需求,分析问题。。。。。。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2