JD.LOCK.WAIT

JD.LOCK.WAIT は、Object.wait() メソッドが 2 つ以上のロックを保持した状態でこのメソッドが呼び出される場合に発生します。このチェッカーは、ローカルのロックのみをチェックします。

脆弱性とリスク

2 つ以上のロックを保持しながらモニターで待機すると、デッドロックになることがあります。wait を実行した場合、待機しているオブジェクトのみのロックが解除され、他のロックは解除されません。必ずしも問題になるとは限りません。

軽減と防止

ロックが保持されていない状態で wait() メソッドを呼び出すか、このメソッドを呼び出す対象のオブジェクトがロックされた状態で呼び出してください。

例 1

コピー
      String name;
     synchronized void waitForCondition(Object lock) {
         try {
             synchronized(lock) {
                 name = "aa";
                 lock.wait();
             }
         } catch (InterruptedException e) {
             return;
         }
     }

JD.LOCK.WAIT が 14 行目に対して報告されています。2 つ以上のロック '[lock, this]' が保持された状態で 'java.lang.Object.wait()' を呼び出すと、デッドロックになる可能性があります。

関連チェッカー