JMM

1. CPU与内存

1.1 CPU架构历史

早期,计算机是单核的。

随着科技的发展,计算机也从单核CPU -> 多核CPU,多核CPU计算机早期,CPU与主内存的交互图如下:

JMM(Java线程内存模型)_多核

这种交互方式有一个问题:

  • CPU的执行速度,比 主内存的执行速度,高出太多;而由于与主内存的交互,会导致CPU资源的浪费。

为了解决:上述的问题,计算机的CPU引入了:高速缓存;如下图:

JMM(Java线程内存模型)_Java并发_02

CPU与高速缓存进行交互,高速缓存与主内存进行交互。

通常,为了解决问题A,而引入的方案B,方案B也会有一定的缺陷。

上图中的缺陷就是:

  • 如果在并发情况下,多个CPU 读写 主内存的同一块数据区,会导致数据的不一致。

为了解决:数据的不一致,又引入了:缓存一致性协议,如下图:

JMM(Java线程内存模型)_高速缓存_03

2. JMM

2.1 JMM是什么?

JMM,全称:Java Memory Model(Java线程内存模型)。

JMM,也是借鉴参考了:现代计算机 CPU与主内存 交互的架构。

2.2 JMM内存模型图

JMM(Java线程内存模型)_单核_04

2.3 JMM的8个指令

  • lock:锁定主内存的一块区域
  • read:读取主内存的数据
  • load:将读取的数据,写入到:线程的工作内存的变量副本
  • use:使用工作内存的变量副本
  • assign:给工作内存的副本 赋值
  • store:工作内存的副本数据 写出
  • write:将写出的数据,写入到:主内存中
  • unlock:解锁主内存的一块区域

JMM(Java线程内存模型)_数据_05