[英]Why does 'wait() method within synchronized block' have deadlock possibility?
当一个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
waitForContion()
但正在等待lock
退出waitForContion()
。
那是一个僵局 。 他们两个都无法取得任何进展,彼此都在等待。
为避免这种情况,一种策略是确保任何线程都具有需要完成的所有资源。 这意味着, lock
和this
只能获得在一起,而不是其他。
此外,当lock.wait()
被调用时,只lock
被释放,而this
是没有的。 因此,在这种情况下,没有线程可以在that
对象上调用waitForContion()
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.