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;
}
}
答案:可能会输出42,可能会输出0,也可能会一直得不到输出。
输出0的原因: number = 42;ready = true;JVM并不能保证以上两条语句按顺序执行。
得不到输出的原因:main线程中对ready的修改有并不能确保被ReaderThread线程得到。
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;
}
}
答案:可能会输出42,可能会输出0,也可能会一直得不到输出。
输出0的原因: number = 42;ready = true;JVM并不能保证以上两条语句按顺序执行。
得不到输出的原因:main线程中对ready的修改有并不能确保被ReaderThread线程得到。