Java 为什么';同步块内的wait()方法';有可能吗?
klocwork JD.LOCK.WAIT问题是在对象.WAIT()方法持有两个或多个锁时调用该方法时报告的 klocwork说,在持有两个锁的情况下等待监视器可能会导致死锁,应该考虑这个问题 但我不明白这为什么会导致僵局 谁能帮我理解这个问题 以下代码来自klockwork。JD.LOCK.WAIT问题发生在第14行Java 为什么';同步块内的wait()方法';有可能吗?,java,synchronized,klocwork,Java,Synchronized,Klocwork,klocwork JD.LOCK.WAIT问题是在对象.WAIT()方法持有两个或多个锁时调用该方法时报告的 klocwork说,在持有两个锁的情况下等待监视器可能会导致死锁,应该考虑这个问题 但我不明白这为什么会导致僵局 谁能帮我理解这个问题 以下代码来自klockwork。JD.LOCK.WAIT问题发生在第14行LOCK.WAIT() 假设t1进入waitForCondition()方法。所以t1现在有这个作为锁。同时,另一个线程刚刚获取了lock对象,正在尝试调用waitForConti
LOCK.WAIT()代码>
假设t1进入waitForCondition()
方法。所以t1现在有这个
作为锁。同时,另一个线程刚刚获取了lock
对象,正在尝试调用waitForContion()
- t2持有
锁
,但正在等待此
进入waitForContion()
- t1持有
此
,但正在等待lock
退出waitForContion()
这是一个僵局。他们两人都不能取得任何进展,正在互相等待
为了避免这种情况,一种策略是确保任何线程都拥有完成任务所需的所有资源。这里它意味着lock
和this
只能一起获取,而不能以其他方式获取
另外,当调用lock.wait()
时,只有lock
被释放,而this
不被释放。因此,在这种情况下,没有线程可以调用对象上的waitForContion()
。如果我将同步方法的参数从object lock更改为byte[]命令(例如),我不需要担心死锁?我看不出这会有什么帮助。有两个锁(此
对象和锁
对象),您希望同时获取它们并将其释放。
String name;
synchronized void waitForCondition(Object lock) {
try {
synchronized(lock) {
name = "aa";
lock.wait(); //line 14
}
} catch (InterruptedException e) {
return;
}
}