volatile
이 아니며 다른 스레드에 의해 변경되기를 기다리는 필드의 값에서 스핀하는 while
루프를 보고합니다.
그러한 루프는 루프 내에서 조금만 작업이 수행돼도 CPU 사용량이 크게 늘어날 뿐만 아니라 의도와 다른 의미를 가지게 될 가능성이 높습니다. Java 메모리 모델에서는 다른 스레드가 필드 값을 변경하는 경우에도 해당 루프가 완료되지 않습니다.
예:
class SpinsOnField {
boolean ready = false;
void run() {
// 다른 스레드에서 markAsReady를 호출한 다음에도
// 루프가 완료되지 않을 수 있습니다
while (!ready) {
}
// 무언가 작업을 실행합니다
}
void markAsReady() {
ready = true;
}
}
또한 Java 9부터는 일부 하드웨어의 성능을 크게 끌어올릴 수 있도록 volatile
필드의 스핀 루프 내에서 Thread.onSpinWait()
를 호출하는 것이 좋습니다.
이 검사 보고서가 빈 while
루프만을 가지도록 하려면 아래 체크박스를 사용하세요.