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 루프만 보고하려면 검사 옵션을 사용하세요.