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