JMM 工作内存 主内存 理解

691 阅读1分钟

这个问题,本质上是对应于实际上CPU和内存的关系模型。尤其是多核心的CPU和内存的关系。

首先,CPU是无法直接对内存中的数据进行计算的,CPU的计算是这样的:

  1. CPU把内存中的数据加载到寄存器中;
  2. 对寄存器中的数据进行计算;
  3. 把计算后的数据写回到内存中;

而且,在CPU和内存中间还有几层高速的缓存。

所以,JVM在设计的时候,其实就是对底层的CPU和内存的关系进行了一个抽象。那么,这些概念就是对应于实际中的角色的:

主内存:就是对应于计算机的内存;

工作内存:对应于CPU中的寄存器和缓存等等,而由于有多核的存在,这个工作内存也会有多个存在。这个概念和线程私有的内存还是不一样的,线程私有的内存,其实是栈内存。

涉及到主存工作内存的问题,多半是和多线程在多个实际的CPU核心中运行的场景中才讨论的。

由于有工作内存的存在,而且可能是分布在不同的CPU核心中,所以就会有数据的“可见行问题”:

可见性问题,本质上就是当有多CPU核心中的多个线程,同时在对一个主内存中的共享数据进行修改的时候,其中一个核心修改之后,其他的核心需要知道这个变量被修改了,以便把自己核心中的缓存给失效了,然后去主存中重新读取。