可见性(visibility)的问题是Java多线程应用中的错误的根源
看下面一段代码,预想的输出结果为 42
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) throws InterruptedException { new ReaderThread().start(); number = 42; ready = true; }}
此段代码有可能输出 0 或者 reader线程死循环
导致这种错误出现的原因
因为在没有同步机制的下,语句的执行顺序不能得到保证。尽管我们得代码number的复制在ready之前,但这并不能保证jvm内部执行也会按照这个顺序,导致读线程出现错误。
更详细内容请参考:Java深度历险(三)——Java线程?:基本概念、可见性与同步
?