JD.LOCK.WAIT
当调用持有两个或更多锁的 Object.wait() 方法时,发生 JD.LOCK.WAIT。该检查器仅检查本地锁。
漏洞与风险
在持有两个锁的情况下在监视器上等待会造成死锁。执行 wait 仅会释放对象上所等待的锁,而不是其他任何锁。不一定是问题。
缓解与预防
最好的方法是在 wait() 方法没有持有锁,或者持有的锁位于其所在的对象上时,对其进行调用。
示例 1
复制
String name;
synchronized void waitForCondition(Object lock) {
try {
synchronized(lock) {
name = "aa";
lock.wait();
}
} catch (InterruptedException e) {
return;
}
}
针对第 14 行报告 JD.LOCK.WAIT:在持有两个或更多锁“[lock, this]”的情况下调用“java.lang.Object.wait()”可能会导致死锁。