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()' を呼び出すと、デッドロックになる可能性があります。

関連チェッカー