JMM——Java内存模型简介

JMM介绍

        JMM是基于CPU缓存模型实现的一套Java内存管理程序,都在于解决多核情况下的缓存同步问题。它定义了主存和工作内存的抽象概念,底层对应着CPU寄存器、高速缓存、RAM、CPU指令优化等。

 

 CPU缓存模型

JMM特性

  1. 可见性:volatile可以保证不同线程对共享变量进行操作时的可见性。即当一个线程修改了共享变量时,另一个线程可以读取到共享变量被修改后的值。
  2. 有序性:volatile会通过禁止指令重排序进而保证有序性。
  3. 原子性:对于单个的volatile修饰的变量的读写是可以保证原子性的,但对于i++这种复合操作并不能保证原子性。这句话的意思基本上就是说volatile不具备原子性了

JMM特性的应用方式

  1. 同时实现可见性、有序性、原子性需要使用synchronized,但是耗费性能;
  2. 同时实现可见性、有序性需要给共享变量加上volatile修饰符,也就是适用于仅有一个线程修改,其它线程读取的场景

可见性

volatile可见性实现原理

如图所示,别看加了一个volatile,但是底层实现很繁杂,首先要确保开启缓存一致性协议,每个线程都要开启总线嗅探机制, 会给主存的变量加锁,然后基于以上步骤实现可见性

 如果存在资源的竞争,这时需要加上锁来资源分配以保证线程资源安全

有序性

原子性

【注:】上图主存指的是所有线程共享的数据,比如公共静态成员变量、公共成员变量,而工作内存是线程自己私有的数据

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值