开始编写并发代码是一件困难的事情,语言不应当增加它的难度。虽然 Java 平台从一开始就包括了对线程的支持,包括一个计划为正确同步的程序提供“一次编写,到处运行”保证的、跨平台的内存模型,但是原来的内存模型有一些漏洞。虽然许多 Java 平台提供了比 JMM 所要求的更强的保证,但是 JMM 中的漏洞使得无法容易地编写可以在任何平台上运行的并发 Java 程序。所以在 2001 年 5 月,成立了以修复 Java 内存模型为目的的 JSR 133。 上个月,我讨论了其中一些漏洞,这个月,我们将讨论如何堵住它们。
修复后的可见性
理解 JMM 所需要的一个关键概念是 可见性(visibility)——如何知道当线程 A 执行 someVariable?=?3 时,其他线程是否可以看到线程 A 所写的值 3?有一些原因使其他线程不能立即看到 someVariable 的值 3:可能是因为编译器为了执行效率更高而重新排序了指令,也可能是 someVariable 缓存在寄存器中,或者它的值写到写处理器的缓存中、但是还没有刷新到主存中,或者在读处理器的缓存中有一个老的(或者无效的)值。内存模型决定什么时候一个线程可以可靠地“看到”由其他线程对变量的写入。特别是,内存模型定义了保证内存操作跨线程的可见性的 volatile 、 synchronized 和 final 的语义