스레딩에 관한 상위 Java 클래스의 선생님이 제가 확신 할 수없는 말을했습니다.
그는 다음 코드가 반드시 ready
변수를 업데이트하는 것은 아니라고 말했습니다 . 그에 따르면 두 스레드가 반드시 정적 변수를 ReaderThread
공유하는 것은 아닙니다. 다른 것을 업데이트하지 않습니다.
기본적으로 그는 ready
메인 스레드에서 업데이트 될 수 있지만 에서는 업데이트되지 ReaderThread
않으므로 ReaderThread
무한 반복됩니다.
그는 또한 프로그램이 0
또는 42
. 어떻게 42
인쇄 할 수 있는지 이해 하지만 0
. 그는 이것이 number
변수가 기본값으로 설정된 경우라고 언급했습니다 .
스레드간에 정적 변수가 업데이트된다는 것이 보장되지 않을 수도 있다고 생각했지만 이것은 Java에 대해 매우 이상합니다. ready
휘발성으로 만들면 이 문제가 해결됩니까?
그는 다음 코드를 보여주었습니다.
public class NoVisibility {
private static boolean ready;
private static int number;
private static class ReaderThread extends Thread {
public void run() {
while (!ready) Thread.yield();
System.out.println(number);
}
}
public static void main(String[] args) {
new ReaderThread().start();
number = 42;
ready = true;
}
}