关于JMM的理解

简介: JMM是java内存模型,它描述的是和多线程相关的一组规范。通过这组规范定义了程序中对各个变量的访问方式。保证了不同jvm运行并发程序的结果的一致性和可靠性。

JMM是java内存模型,它描述的是和多线程相关的一组规范。通过这组规范定义了程序中对各个变量的访问方式。保证了不同jvm运行并发程序的结果的一致性和可靠性。

在JMM中有主存储器和工作存储器两种概念(主存工作内存)。JMM规定所有变量都存储在主存中,并且每个线程都有自己的工作内存。线程的工作内存中保存主存中某些数据的拷贝,并且线程对变量的所有操作都必须在工作内存中进行,不能直接读写主存。不同线程也不能访问其他线程的工作内存,线程间通信必须通过主存完成。

JMM有三大特性:

原子性:一个或多个操作,要么全部执行,要么全部不执行。

可见性:只要有一个线程对共享变量(valoatile修饰才会成为共享变量)的值做了修改,其他线程都能马上收到通知,立刻获得最新值。

有序性:在线程内观察,操作都是有序的,而在线程内观察另一个线程,操作都是无序的(因为指令重排序和工作内存和主存的同步延迟)。


java提供了两个关键字volatile和synchronized来保证多线程间操作的有序性

synchronized通过加锁防止多个线程同时执行一段代码,线程执行互斥代码的过程如下:

  1. 获得同步锁;
  2. 清空工作内存;
  3. 从主内存拷贝对象副本到工作内存;
  4. 执行代码;
  5. 刷新主内存数据;
  6. 释放同步锁。

因此synchronized既保证了多线程的并发有序性,又保证了多线程的内存可见性。

volatile有两个作用:禁止指令重排序,保证内存可见性。它是依靠内存屏障(内存栅栏)实现的,内存屏障提供三个功能:1、确保内存屏障前后的指令不会发生跨屏障的重排。2、对volatile修饰变量的修改会立刻刷入主存。3、对volatile变量的写操作会使其他CPU中的缓存失效,因此必须重新从主存读取。

但是volatile不能保证操作的原子性,因此不能保证多线程的并发有序。

参考:

https://blog.csdn.net/LYQ20010417/article/details/124138635

https://blog.csdn.net/zjcjava/article/details/78406330

相关文章
|
22天前
|
人工智能 区块链 Python
元宇宙不是空壳子:聊聊未来经济体系怎么搭建
元宇宙不是空壳子:聊聊未来经济体系怎么搭建
103 8
|
5月前
|
人工智能 监控 API
全网跪求的抢票神器!用 CodeBuddy 联动魔搭 MCP,我把 12306 抢票系统玩明白了
CodeBuddy 作为智能编程领域的佼佼者,无需用户具备深厚的编程知识,就能依据用户需求迅速生成高效代码。在票务信息获取方面,它巧妙地构建起与两款 MCP 顺畅交互的桥梁。通过简洁直观的指令输入,CodeBuddy 将用户对票务信息的需求精准转化为机器可理解的语言,为后续获取信息的流程奠定坚实基础。
368 2
|
8月前
|
机器学习/深度学习 资源调度 计算机视觉
RT-DETR改进策略【Conv和Transformer】| CVPR-2022 Deformable Attention Transformer 可变形注意力 动态关注目标区域
RT-DETR改进策略【Conv和Transformer】| CVPR-2022 Deformable Attention Transformer 可变形注意力 动态关注目标区域
357 15
RT-DETR改进策略【Conv和Transformer】| CVPR-2022 Deformable Attention Transformer 可变形注意力 动态关注目标区域
|
12月前
|
存储 NoSQL MongoDB
掌握MongoDB索引优化策略:提升查询效率的关键
在数据库性能调优中,索引是提升查询效率的利器。本文将带你深入了解MongoDB索引的内部工作原理,探讨索引对查询性能的影响,并通过实际案例指导如何针对不同的查询模式建立有效的索引。不仅将涵盖单一字段索引,还会探讨复合索引的使用,以及如何通过分析查询模式和执行计划来优化索引,最终实现查询性能的最大化。
|
6月前
|
存储 监控 数据处理
不断突破极致:SPL新版数据加工能力焕新登场
SPL 算子不仅完成了旧版 DSL 加工向更强大语法和算子形式的过渡,更将性能调优和场景适配做到了极致,解锁了时序预测和日志分析的更多可能性。作为重要的基础设施模块,SPL 加工能力将持续优化演进。未来的规划将继续聚焦通用性、性能与产品能力,为用户提供更加强大、灵活的技术支持。
|
8月前
|
机器学习/深度学习 计算机视觉
RT-DETR改进策略【注意力机制篇】| ICCV2023 聚焦线性注意力模块 Focused Linear Attention 聚焦能力与特征多样性双重提升,含二次创新
RT-DETR改进策略【注意力机制篇】| ICCV2023 聚焦线性注意力模块 Focused Linear Attention 聚焦能力与特征多样性双重提升,含二次创新
235 1
|
存储 SQL 算法
【动态规划】切割钢条详解python
【动态规划】切割钢条详解python
|
运维 监控 安全
在Linux中,如何进行故障排查?
在Linux中,如何进行故障排查?
|
机器学习/深度学习 人工智能 自然语言处理
3D智能导诊系统源码,基于AI引擎,针对患者的病情及症状,结合性别年龄特征,智能推荐医院科室
智能导诊系统是一款基于AI技术的医疗辅助工具,利用自然语言处理和机器学习分析患者病情,精准推荐科室和医生。系统支持按性别分类导诊,设有3D人体模型辅助定位症状,界面简洁易操作。采用B/S架构,可无缝对接HIS数据库,支持多种接入形式,包括公众号、小程序和App,有效提升就诊效率并减轻医护人员负担。
342 0
|
JavaScript 程序员 网络架构
vue路由从入门到进阶 --- 声明式导航详细教程
vue路由从入门到进阶 --- 声明式导航详细教程
vue路由从入门到进阶 --- 声明式导航详细教程