本文最后更新于:2020年9月17日 上午

Java并发系列(十五)-Java内存模型综述

首先,我们需要一个整体的认识,顺序一致性内存模型是一个理论参考模型,JMM和处理器内存模型在设计时通常会以顺序一致性内存模型为参照。

1、处理器的内存模型

1.1、处理器内存模型的分类

  • TSO 放松程序中写-读操作的顺序。
  • PSO 继续放松程序中写-写操作的顺序。
  • RMO和PowerPC 继续放松程序中读-写和读-读操作的顺序。

1.2、处理器内存模型的特征

  • 所有处理器内存模型都允许写-读重排序。因为它们都使用了写缓冲区。(允许更早读到当前处理器的写,由于写缓冲区仅对当前处理器可见)
  • 越是追求性能的处理器,内存模型设计越弱
  • 常见的处理器内存模型要比JMM弱,所以要插入内存屏障,来限制处理器的重排序。

1.3、JMM如何屏蔽不同处理器内存模型的差异

插入内存屏障

2、各种内存模型之间的关系

内存模型的强弱比较:

顺序一致性内存模型 -> 语言内存模型 -> 处理器内存模型

3、JMM的内存可见性保证

Java程序的内存可见性保证分为3类:

1.单线程程序:

    编译器、runtime和处理器会共同保证单线程程序的执行结果和在顺序一致性模型中的执行结果相同。

2.正确同步的多线程程序:

    正确同步的多线程程序的执行将具有顺序一致性。

    JMM通过限制编译器和处理器的重排序来为程序提供内存可见性保证。

3.未同步、未正确同步的多线程程序:

    JMM提供最小安全性保障,线程执行时读取到的值,要么是之前某个线程写入的值,要么是默认值(0,null,false)。

4、JSR-133对就内存模型的修补

  • 增强volatile的内存语义。

    严格限制volatile变量与普通变量的重排序。
  • 增强final的内存语义。

    增加两个重排序规则(写、读),在保证final引用不会从构造函数内逸出的情况下,final具有初始化安全性。

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!博客中转载文章会注明出处,若有版权问题,请及时与我联系!谢谢!

Java并发系列(十六)-Lock接口 上一篇
Java并发系列(十四)-双重检查锁定与延迟初始化 下一篇