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;
}
}
根据“Java Concurrency in Practice”,它可能会打印 0,因为在写入数字之前可能会使读取器线程可以看到写入就绪,或者程序永远不会终止,因为它没有使用足够的同步。不保证主线程写入的 ready 和 number 的值对 reader 线程可见。
这怎么可能?程序将由一个线程按顺序运行,它首先写入数字然后准备好变量。不是吗?这个程序怎么会永远循环呢?