问题:我的问题是关于同步关键字和死锁。如果我要有一个只有一个同步方法的 java 程序,它不可能死锁吧?
我的答案的解释:好吧,我得出的结论是这个陈述是错误的,因为我能想到的唯一场景是如果同步方法调用另一个锁定并等待同步方法释放它的方法怎么办锁
但是另一方面,我已经说过程序包含一个同步方法。因此没有其他方法所以它不可能死锁
如果我要有一个只有一个
方法的 java 程序,它不可能死锁吧?synchronized
不正确。这是一个反例。
public class Demo {
public synchronized void op(Demo other) {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// ignore
}
if (other != null) {
other.op(null);
} else {
System.out.println("I have both locks!");
}
}
public static void main(String[] args) throws Exception {
Demo d1 = new Demo();
Demo d2 = new Demo();
new Thread(() -> d1.op(d2)).start();
new Thread(() -> d2.op(d1)).start();
}
}
重要的不是方法的数量。就是锁的数量和线程的数量。对于
synchronized
的实例方法,锁是您调用该方法的实例。
所以上面的例子有两个线程和两个锁……我安排了两个线程尝试获取两个锁,但顺序不同。 (使用
sleep
调用以确保两个线程在时间上重叠。)