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

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

示例:


  class SpinsOnField {
      boolean ready = false;

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

      void markAsReady() {
          ready = true;
      }
  }

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

使用下面的复选框可使此检查仅报告空 while 循环。