JD.LOCK.SLEEP

JD.LOCK.SLEEP は、ロックが保持された状態でメソッドが Thread.sleep() を呼び出す場合に発生します。

脆弱性とリスク

この結果、他のスレッドがロックの獲得を待機するため、パフォーマンスと拡張性の著しい低下やデッドロックが生じることがあります。ロック中に wait() を呼び出すのは非常に優れた方法です。この場合、ロックが解除され、他のスレッドが実行可能になります。

軽減と防止

ロックを保持していない状態で sleep() メソッドを呼び出してください。

例 1

コピー
     String name;
     synchronized void finish(Object o) throws InterruptedException {
         while (!name.equals("root")) {
             Thread.sleep(1000);
         }
     }

JD.LOCK.SLEEP が 16 行目に対して報告されています。ロック '[this]' が保持された状態で 'java.lang.Thread.sleep(long)' を呼び出すと、デッドロックになる可能性があります。

関連チェッカー