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