一起来看看什么是JMM模型

一起来看看什么是JMM模型

JMM(Java Memory Model)是java内存模型,是一种规范、规则,一种抽象的概念。通过这组规范定义了程序中各个变量(包括实例字段,静态字段和构成数组对象的元素)的访问方式。那么JMM规定的访问方式是怎样的,JMM规定,所有的变量必须存储在主内存当中,每个线程访问主内存的变量时,不能直接访问,而是在本线程内开辟一块工作内存,将主内存中的变量复制到工作内存中,线程才可以进行访问。

未命名文件 (4).png

  • 主内存:存储Java实例对象。
  • 工作内存:存储当前方法的所有本地变量信息(工作内存中存储着主内存中的变量副本拷贝)。

JVM与JMM的区别

JVM是java虚拟机,是负责管理内存的。JMM是java内存模型,是一种抽象的概念,并不真实存在,规定了程序中各个变量的访问方式,侧重于围绕原子性、有序性、可见性。

JMM与硬件内存架构的关系

前面我们说到,JMM是并不真实存在的,在硬件内存中并不知道JMM内存模型的存在,因此,多线程的执行最终还是会回归到硬件架构中。

为什么需要JMM

假设我们遇到了以下场景:

现在我有两个线程,分别是线程A、线程B,在JMM规范下,他们是有各自的工作内存的,假设现在他们分别要对主内存共享变量x=6进行修改操作,A想要修改x为1,B想要修改x为2,那么x最终的结果是不确定的,要看先执行谁,这就导致了主内存与工作内存数据不一致性的问题。因此我们需要JMM协议去规范这一些问题。

未命名文件 (5).png

并发编程的原子性、有序性、可见性问题

原子性

原子性顾名思义,是指操作是不可中断的、一气呵成的。

JMM保证原子性:JMM协议是通过synchronized关键字去保证原子性的。

有序性

在cpu执行指令时,他会对指令进行优化,也就是我写在下面的代码有可能在cpu指令优化的作用下提前执行,但是前提都是保证我们的执行结果是正确的。但有时指令优化也会带来一系列的问题,因此需要去保证有序性。

JMM保证有序性:JMM协议是通过volatile关键字去保证原子性的。

可见性

可见性是指一个线程能否读到变量x最新的值,因为变量x有可能会被其他线程修改值。

JMM保证可见性:JMM协议是通过volatile关键字去保证原子性的。

Guess you like

Origin juejin.im/post/7034402826503749662