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