报告在非 volatile
字段值上自旋,等待它被另一个线程更改的 while
循环。
除了在循环内完成少量工作时可能会非常耗费 CPU 之外,此类循环很可能具有与预期不同的语义。 即便另一个线程改变了该字段的值,Java 内存模型也允许该循环永不完成。
示例:
class SpinsOnField {
boolean ready = false;
void run() {
// 即使在从其他线程调用 markAsReady 后,
// 该循环也可能永不完成
while (!ready) {
}
// 执行某些工作
}
void markAsReady() {
ready = true;
}
}
此外,自 Java 9 起,建议在 volatile
字段的自旋循环中调用 Thread.onSpinWait()
,这可能会显著提高在某些硬件上的性能。
使用下面的复选框可使此检查仅报告空 while
循环。