《Java并发编程实战》3.1节的一段代码:
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,有可能陷入死循环。原因是代码中没有足够的同步机制,无法保证主线程写入的ready他number对读线程是可见的。也有可能是0,原因是“重排序”,读线程看到了主线程写入的ready却没有看到number。但是经过多次测试,始终输出42,既没有输出0,也没有死循环。为了验证书中所说的主线程修改对读线程不可见,我改写了代码:
public class NoVisibilityLoop {
private static int number;
private static class ReaderThread extends Thread {
public void run() {
while (true) {
System.out.println(number);
try {
Thread.sleep(200);
} catch (InterruptedException e) {
}
}
}
}
public static void main(String[] args) throws InterruptedException {
new ReaderThread().start();
Thread.sleep(1000);
number = 42;
}
}
多次测试输出结果是:
0
0
0
0
0
42
42
42
42
这个结果说明了主线程写入的number对读线程是可见的。但是这本书的作者一堆大牛,不会搞错的。还请大家帮忙看看我的验证方法哪里出问题了,谢谢。
运行环境:jdk 1.8.0_101,server模式。
慕斯王
慕桂英3389331
POPMUISE
相关分类