报告在非 volatile 字段值上自旋,等待它被另一个线程更改的 while 循环。

除了在循环内完成少量工作时可能会非常耗费 CPU 之外,这样的循环很可能具有与预期不同的语义。 即便另一个线程改变了该字段的值,Java 内存模型也允许这样的循环永不完成。

示例:

  class SpinsOnField {
    boolean ready = false;

    void run() {
      while (!ready) { // 即使在从另一个线程调用 markAsReady 之后,
                       // 该循环也可能永不完成
      }
      // 执行某些工作
    }

    void markAsReady() {
      ready = true;
    }
  }

此外,自 Java 9 起,建议在 volatile 字段的自旋循环中调用 Thread.onSpinWait(),这可能会显著提高某些硬件上的性能。

使用检查选项仅报告空的 while 循环。