JD.LOCK.NOTIFY

当代码调用持有两个锁的 notify() 或 notifyAll() 时,发生 JD.LOCK.NOTIFY。

漏洞与风险

代码调用持有两个锁的 notify() 或 notifyAll()。如果该通知的目的是唤醒持有相同锁的 wait(),则可能会导致死锁,因为 wait 仅会放弃一个锁,因而 notify 将无法获得两个锁,因此 notify 将不会成功。如果还存在关于双锁等待的警告,则很有可能会出现问题。

缓解与预防

最好调用没持有锁的 notify() 方法。

示例 1

复制
      synchronized void finish(Object o) {
         synchronized(o) {
             o.notify();
         }
     }

针对第 11 行报告 JD.LOCK.NOTIFY:调用持有两个或更多锁“[this, o]”的“java.lang.Object.notify()”可能会导致死锁。

相关检查器