非 volatile
フィールドの値で周回しており、別スレッドによる変更を待機している while
ループを報告します。
このようなループはループ内でほとんど作業が行われない場合に CPU 消費が非常に激しくなる可能性があるうえ、意図したものとは異なるセマンティクスを持っている可能性があります。 Java メモリモデルでは、別スレッドによってフィールドの値が変更された場合でも、このようなループが完了することはありません。
例:
class SpinsOnField {
boolean ready = false;
void run() {
// このループは markAsReady が他のスレッドから
// 呼び出されても完了しない可能性があります
while (!ready) {
}
// 何らかの処理を実行
}
void markAsReady() {
ready = true;
}
}
また、Java 9 以降は volatile
フィールドの周回ループ内で Thread.onSpinWait()
を呼び出すことをお勧めします。これにより、一部のハードウェアのパフォーマンスが大幅に向上する可能性があります。
このインスペクションに空の while
ループのみを報告させるには、下のチェックボックスを使用します。