当方法持有两个或更多个锁时调用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;
}
}
答案 0 :(得分:1)
让我们说 t1 进入waitForCondition()
方法。所以 t1 现在有this
作为锁。与此同时,其他一些线程刚刚获得了lock
个对象,正在尝试调用waitForContion()
。
t2 持有lock
,但正在等待this
输入waitForContion()
。
t1 持有this
但等待lock
退出waitForContion()
。
这是死锁。他们俩都没有取得任何进展,而是在互相等待。
为避免这种情况,一种策略是确保任何线程都具有完成所需的所有资源。这意味着lock
和this
只能一起获得而不是其他方式。
此外,调用lock.wait()
时,只会释放lock
,而this
则不会。因此,在这种情况下,没有线程可以在waitForContion()
对象上调用that
。