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线程得到。
本文通过一个Java示例代码展示了多线程环境下内存可见性的问题。该程序可能会输出42、0或者一直不输出,原因是number变量的赋值与ready变量的修改在JVM中不一定按顺序执行,且main线程对ready的修改可能不会立即被ReaderThread线程看到。
239

被折叠的 条评论
为什么被折叠?



