スレッドに関する上位レベルのJavaクラスの私の先生は、私が確信が持てないことを言いました。
彼は、次のコードは必ずしもready
変数を更新するとは限らないと述べました。彼によると、2つのスレッドは必ずしも静的変数を共有するわけではありません。特に、各スレッド(メインスレッドとReaderThread
)が独自のプロセッサで実行されているため、同じレジスタ/キャッシュなどと1つのCPUを共有しない場合はそうです。もう一方は更新されません。
ready
基本的に、メインスレッドでは更新される可能性がありますが、では更新されない可能性があるReaderThread
ため、ReaderThread
無限にループする可能性があると彼は言いました。
彼はまた、プログラムが印刷することも可能であると主張し0
た42
。印刷方法はわかります42
が、わかりません0
。number
彼は、これは変数がデフォルト値に設定されている場合に当てはまると述べました。
静的変数がスレッド間で更新されることはおそらく保証されていないと思いましたが、これはJavaにとって非常に奇妙なことです。volatileを作成すると、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;
}
}