JD.LOCK.NOTIFY
JD.LOCK.NOTIFY は、2 つのロックが保持されているときに notify() または notifyAll() が呼び出される場合に発生します。
脆弱性とリスク
2 つのロックが保持されているときに notify() または notifyAll() が呼び出されています。この通知が同じロックを保持する wait() のウェークアップを意図する場合、デッドロックになる可能性があります。wait は 1 つのロックのみを放棄し、notify は両方のロックを取得できないためです。したがって、notify は成功しません。2 つの lock wait の警告もある場合には、かなり高い確率で問題があります。
軽減と防止
ロックが保持されていない状態で notify() メソッドを呼び出してください。
例 1
コピー
synchronized void finish(Object o) {
synchronized(o) {
o.notify();
}
}
JD.LOCK.NOTIFY が 11 行目に対して報告されています。2 つ以上のロック '[this, o]' が保持された状態で 'java.lang.Object.notify()' を呼び出すと、デッドロックになる可能性があります。