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()”可能会导致死锁。

相关检查器