JMM内存模型&8个交互操作

一、为什么要有JMM?

讲JMM之前,我们先来看一下并发环境下物理机会遇到什么问题?

1.1并发下物理机问题1:硬件处理效率

物理内存的第一个问题是:硬件处理效率。

  • 绝大多数的运算任务都不可能只靠处理器“计算”就能完成,处理器至少需要与内存交互,如读取运算数据、存储运算结果,这个 I/O 操作是很难消除的(无法仅靠寄存器完成所有运算任务)。
  • 由于计算机的存储设备与处理器的运算速度有几个数量级的差距 ,这种速度上的矛盾,会降低硬件的处理效率。所以,现代计算机都不得不 加入高速缓存(Cache) 来作为内存和处理器之间的缓冲。将需要用到的数据复制到缓存中,让运算能快速进行,当运算结束后再从缓存同步会内存中,这样处理器就无需等待缓慢的内存读写了。

总结: 硬件中使用高速缓存来作为内存和处理器之间的缓冲,JMM内存模型与cpu缓存模型类似,是基于cpu缓存模型来建立的。

1.2并发下物理机问题2:缓存一致性

高速缓存解决了 硬件效率问题,但是引入了一个新的问题:缓存一致性(Cache Coherence)

在多处理器系统中,每个处理器都有自己的高速缓存,而它们又共享同一主内存。当多个处理器的运算任务都涉及同一块主内存区域时,将可能导致各自的缓存数据不一致。

为了解决缓存一致性问题,需要各个处理器访问缓存时都遵循一些协议,在读写时要根据协议来进行操作

总结: JMM模型在这个问题上,使用volatile关键字,volatile的底层是使用MESI缓存一致性协议实现的,通过总线嗅探机制实现感知数据的变化,从而将自己缓存里的数据失效。
在这里插入图片描述
在这里插入图片描述
JMM借鉴了物理机对于并发问题的处理策略,并给出了上图的JMM内存模型。 回到开头的问题:

  • 为什么会有JMM?
    • 为了解决虚拟机的并发问题,并屏蔽各种硬件和操作系统的内存访问的差异(cpu计算速度和内存IO速度差好几个数量级),借鉴了物理机遇到并发问题的处理方案。实现让Java程序在各个平台下都能达到一致的内存访问效果
    • 硬件软件处理速度差异问题:
      • 利用工作内存(高速缓存)来解决
    • 缓存数据一致性问题:
      • 利用Volatile关键字(缓存一致性协议)来解决,Volatile底层是使用MESI缓存一致性协议实现的,通过总线嗅探机制实现感知数据的变化,从而将自己缓存里的数据失效

二、JMM的内存结构和8个交互操作

JMM规定了所有的变量都存储在主内存中,每条线程还有自己的工作内存,工作内存中保留了线程使用到的变量的主内存的副本。
JMM定义了 8 个操作来完成主内存和工作内存之间的交互操作。JVM 实现时必须保证下面介绍的每种操作都是 原子的。

  • lock (锁定) - 作用于主内存的变量,它把一个变量标识为一条线程独占的状态。【加琐时的操作】
  • unlock (解锁) - 作用于主内存的变量,它把一个处于锁定状态的变量释放出来,释放后的变量才可以被其他线程锁定。
  • read (读取) - 作用于主内存的变量,它把一个变量的值从主内存传输到线程的工作内存中,以便随后的 load 动作使用。
  • write (写入) - 作用于主内存的变量,它把 store 操作从工作内存中得到的变量的值放入主内存的变量中。
  • load (载入) - 作用于工作内存的变量,它把 read 操作从主内存中得到的变量值放入工作内存的变量副本中。
  • use (使用) - 作用于工作内存的变量,它把工作内存中一个变量的值传递给执行引擎,每当虚拟机遇到一个需要使用到变量的值得字节码指令时就会执行这个操作【运算】。
  • assign (赋值) - 作用于工作内存的变量,它把一个从执行引擎接收到的值赋给工作内存的变量,每当虚拟机遇到一个给变量赋值的字节码指令时执行这个操作【赋值】。
  • store (存储) - 作用于工作内存的变量,它把工作内存中一个变量的值传送到主内存中,以便随后 write 操作使用。

如果要把一个变量从主内存中复制到工作内存,就需要按序执行 readload 操作
;如果把变量从工作内存中同步回主内存中,就需要按序执行 storewrite 操作
。但 Java 内存模型只要求上述操作必须按顺序执行,而没有保证必须是连续执行。

  • JMM内存的8个交互操作流程
    • 主内存→read→load→工作内存→use→业务方法→assign→工作内存→store→write→主内存
      在这里插入图片描述

参考文献

B站视频
内存模型

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值