处理器内存模型
顺序一致性内存模式是一个理论的参考模式。JMM和处理器内存模型都是参照顺序一致性内存模型来设计的。
在设计JMM和处理器内存模型的时候都会做一些放松。因为如果按照顺序一致性内存模型来设计JMM和处理器内存模型的话,许多性能的优化就不可以使用。
针对不同类型的读写操作的执行顺序的放松,处理器内存模型可以分为以下几种。
- 放松程序中的写-读操作————Total Store Ordering内存模型(TSO)
- 在1的基础上继续放松写-写操作————Partial Store Order内存模型(PSO)
- 在2的基础上继续放松读-写 和 读-读操作————Relaxed Memory Order(RMO)和PowerPC内存模型
这里对处理器的读-写操作的放松,是基于两个操作之间没有数据依赖性为前提的(处理器要遵循as-if-serial语义)
内存模型名称 | Store-Load | Sotre-Store | Load-Load 和 Load-Sotre | 可以更早的读到其他处理器的写 | 可以跟早的读到当前处理器的写(写缓冲) |
---|---|---|---|---|---|
TSO | Y | Y | |||
PSO | Y | Y | Y | ||
RMO | Y | Y | Y | Y | |
PowerPC | Y | Y | Y | Y | Y |
处理内存特征表
因为常见的处理器的内存模型比JMM要弱,所以JMM在各个平台上都进行了处理,通过插入不同的内存屏障(限制处理器的重排序)来达到统一的内存模型。
JMM通过内存屏障屏蔽了不同处理器的内存模型的差异,给Java程序员提供了一个一致的内存模型。
语言级内存模型和处理器级内存模型
处理机内存模型的性能高于语言级内存模型,但是编程的难易方面语言级内存模型高于处理器级内存模型。
一句话:性能越好,易编程性越差。常见的几种内存模性,PowerPC性能最高(易编程性最差)。顺序一致性内存模型易编程性最好(性能最差)
JMM的内存可见性保证
单线程程序:单线程程序不会出现内存可见性问题。 编译器、runtime、处理器会共同保证该执行结果和顺序一致性内存模型的处理结果一致。
正确同步的多线程程序:正确同步的多线程程序会具有顺序一致性(与顺序一致性内存模型的结果相同) 通过JMM限制处理器和编译器的重排序。
未同步/为正确同步的多线程程序:JMM提供最小的安全保障,读到的值要么是之前程序写入的值,要么是默认值(0、null、false)