当调用 Object.wait() 方法且该方法持有两个或更多锁时,会报告 klocwork JD.LOCK.WAIT 问题。
klocwork 表示,在持有两个锁的情况下等待监视器可能会导致死锁,应该考虑到这个问题。
但我不明白为什么这会导致死锁。
谁能帮我理解这个问题?
以下代码来自 klockwork。 JD.LOCK.WAIT 问题发生在第 14 行 lock.wait();
。
String name;
synchronized void waitForCondition(Object lock) {
try {
synchronized(lock) {
name = "aa";
lock.wait(); //line 14
}
} catch (InterruptedException e) {
return;
}
}
最佳答案
假设t1进入waitForCondition()
方法。所以t1现在有this
作为锁。与此同时,其他一些线程刚刚获取了lock
对象并尝试调用waitForContion()
。
t2 持有
lock
,但正在等待this
进入waitForContion()
。t1 持有
this
,但正在等待lock
退出waitForContion()
。
这是一个僵局。两人都无法取得任何进展,只能互相等待。
为了避免这种情况,一种策略是确保任何线程都拥有完成所需的所有资源。这里的意思是lock
和this
只能一起获取,否则不能获取。
此外,当调用 lock.wait()
时,仅释放 lock
,而 this
则不会。因此,在这种情况下,没有线程可以在该
对象上调用waitForContion()
。
关于java - 为什么 'wait() method within synchronized block'有可能出现死锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18481850/