浅谈Java内存模型(JMM)

浅谈Java内存模型(JMM)

1. 什么是JMM?

  • JMM(Java内存模型)本身是一种抽象的概念并不真实存在,它描述的是一组规则或规范,通过这组规范定义了程序中各个变量(包括实例字段,静态字段和构成数组对象的元素)的访问方式。总结:就是规范,抽象的模型。
    *JMM模型抽象图
    1)内存:共享的数据
    2)工作空间:工作内存,基本数据类型,直接分配到工作内存,引用类型的数据将引用的地址存放在工作内存,引用的对象存放堆中。
    3)工作方式:
    A 线程修改私用数据,直接在工作空间修改。
    B 线程修改共享数据,把数据复制到工作空间中去,在工作空间修改,修改完毕以后,再刷新内存中的数据。

2.JMM用来干什么?

  • JMM是Java内存模型,既然是模型,必定是能提供一种规范指导产出一种产品的东西。那么JMM指导的是什么呢?JVM就是根据JMM在物理内存划分出的结果。Java内存模型的作用是规范内存数据和工作空间数据的交互 。

3.计算机与JMM

  • 先看看计算机的硬件内存架构:
    *
    计算机硬件架构存在的问题:
    多个CPU并行处理缓存数据时,并发处理的不同步,会产生数据一致性问题。
    解决方案:
    Ⅰ. 总线加锁:CPU核执行一个线程去访问数据做操作的时候,向总线上发送一个LOCK信号,通过把内存和CPU之间的通信锁住,把并行化的操作变成了串行。虽然能解决一致性问题,但是会导致很严重的性能问题。
    Ⅱ. 缓存的一致性协议(MESI):当CPU在Cache中操作数据时,如果该数据是共享变量,数据在Cache读到寄存器中,进行新修改,并更新内存数据Cache Line置无效。其他的CPU拿取数据,若Cache Line为无效会从内存中拿取。

Java内存模型与硬件内存架构的关系
JMM与计算机的硬件内存架构非常的相似。所以会遇到相似的问题和对应问题的解决方案。并发会有三个重要的特征,Java对这些特征有对应的保证方式:

  • 1、原子性:不可分割,像变量的赋值x=1便是原子性,但y=x没有原子性,因为先是从x读到工作空间(原子性),把x的值写到y(原子性)。同理x++,z=z+1都没有原子性。多个原子性的操作合并没有原子性。(Java的保证操作:Synchronized 、JUC Lock的lock)
  • 2、可见性:线程只能操作自己工作空间中的数据(Java的保证操作:Volatile、Synchronized、JUC Lock的lock)
  • 3、有序性:程序中的顺序不一定就是执行的顺序,因为涉及编译时编译重排序、指令重排序来提高效率(Java的保证操作: Volatile、Synchronized)

创作不易,转载请注明出处!

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值