题目描述
这段代码是可以执行的,但是我删除static Object o1 = new Object(), o2 = new Object();前面的static,死锁问题就没了,求解答?
相关代码
public class TestDeadLock implements Runnable {
int flag = 1;
static Object o1 = new Object(), o2 = new Object();
public static void main(String[] args) {
TestDeadLock tdl1 = new TestDeadLock();
TestDeadLock tdl2 = new TestDeadLock();
tdl1.flag = 0;
tdl2.flag = 1;
Thread t1 = new Thread(tdl1);
Thread t2 = new Thread(tdl2);
t1.start();
t2.start();
}
@Override
public void run() {
System.out.println("flag:" + flag);
if (flag == 0) {
synchronized (o1) {
try {
Thread.sleep(1000);
} catch (Exception e) {
// TODO: handle exception
}
synchronized (o2) {
System.out.println("0");
}
}
}
if (flag == 1) {
synchronized (o2) {
try {
Thread.sleep(1000);
} catch (Exception e) {
// TODO: handle exception
}
synchronized (o1) {
System.out.println("1");
}
}
}
}
}
2 回答
绝地无双
TA贡献1946条经验 获得超4个赞
因为在你使用static修饰以后o1 o2两个实例是静态实例,(在类被加载的时候就已经创建),不管你创建多少个TestDeadLock对象,他们都是同一个,所以不同的TestDeadLock实力访问的时候会造成锁等待,从而导致死锁的产生。
但是如果去除static这里的o1和o2只是成员属性,所以当你new不同的TestDeadLock对象的时候,他们其实是不同的对象,互相之间根本不受到影响(虽然代码层面看起来都是o1 o2,但实际程序运行的时候tdl1的o1 o2,和tdl2的o1 o2是不一样的,完全无关)
添加回答
举报
0/150
提交
取消