12.3 Java内存模型

12.3 Java内存模型

《Java虚拟机规范》[^1]中曾试图定义一种“Java内存模型”[^2](Java Memory Model,JMM)来屏 蔽各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的内存访问效 果。在此之前,主流程序语言(如C和C++等)直接使用物理硬件和操作系统的内存模型。因此,由于 不同平台上内存模型的差异,有可能导致程序在一套平台上并发完全正常,而在另外一套平台上并发 访问却经常出错,所以在某些场景下必须针对不同的平台来编写程序。

定义Java内存模型并非一件容易的事情,这个模型必须定义得足够严谨,才能让Java的并发内存访问操作不会产生歧义;但是也必须定义得足够宽松,使得虚拟机的实现能有足够的自由空间去利用硬件的各种特性(寄存器、高速缓存和指令集中某些特有的指令)来获取更好的执行速度。经过长时间的验证和修补,直至JDK 5(实现了JSR-133[^3])发布后,Java内存模型才终于成熟、完善起来了。

[^1]: 在《Java虚拟机规范》的第2版及之前,专门有一章“Threads and Locks”来描述内存模型,后来由于 这部分内容难以把握宽紧限度,被反复修正更新,从第3版(Java SE 7版)开始索性就被移除出规范, 独立以JSR形式维护。
[^2]: 本书中的Java内存模型都特指目前正在使用的,在JDK 1.2之后建立起来并在JDK 5中完善过的内存 模型。
[^3]: JSR-133:Java Memory Model and Thread Specification Revision(Java内存模型和线程规范修订)。