volatile이 아닌 필드의 값에서 스핀하며 다른 스레드에 의해 변경되기를 기다리는while 루프를 보고합니다.

그러한 루프는 루프 내에서 조금만 작업해도 CPU 사용량이 엄청나게 늘어나는 것 외에도 의도된 것과 다른 의미를 가질 가능성이 있습니다. Java 메모리 모델에서는 다른 스레드가 필드 값을 변경하는 경우에도 그러한 루프가 완료되지 않습니다.

또한 Java 9 이후에서 일부 하드웨어의 성능을 상당히 향상시킬 수 있도록 volatile 필드의 스핀 루프 내에서 Thread.onSpinWait()을 호출할 것을 권장합니다.

예:


  class SpinsOnField {
    boolean ready = false;

    void run() {
      while (!ready) {
      }
      // do some work
    }

    void markAsReady() {
      ready = true;
    }
  }

빠른 수정을 적용한 후:


  class SpinsOnField {
    volatile boolean ready = false;

    void run() {
      while (!ready) {
        Thread.onSpinWait();
      }
      // do some work
    }

    void markAsReady() {
      ready = true;
    }
  }

while 루프만 보고하려면 검사 옵션을 사용하세요.