关于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

相关文章
|
云安全 存储 安全
一文看全数据跨境合规
于9月1日正式实施的《数据安全法》再次加码数据出境安全。 基于8月27日《数据安全法》解读与阿里云三大合规方案线上直播活动,阿里云解决方案架构师锅涛分享的《数据跨境流转安全》主题内容,整理出数据出境安全的九问九答,为企业数据跨境流转送上安全锦囊。
1390 0
一文看全数据跨境合规
|
4月前
|
负载均衡 算法 关系型数据库
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
本文聚焦 MySQL 集群架构中的负载均衡算法,阐述其重要性。详细介绍轮询、加权轮询、最少连接、加权最少连接、随机、源地址哈希等常用算法,分析各自优缺点及适用场景。并提供 Java 语言代码实现示例,助力直观理解。文章结构清晰,语言通俗易懂,对理解和应用负载均衡算法具有实用价值和参考价值。
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
|
27天前
|
NoSQL 关系型数据库 MySQL
在Visual Studio Code中设置MySQL源码调试环境
以上步骤涵盖了在VS Code中设置MySQL源码调试环境的主要过程,是一个相对高级的任务,旨在为希望建立强大开发和调试环境的开发者提供指引。遵循这些步骤,将可以利用VS Code强大的编辑和调试功能来深入理解和改进MySQL数据库的底层实现。
205 0
|
机器学习/深度学习 运维 监控
智能运维:未来IT管理的革新之路
在数字化浪潮汹涌的今天,智能运维成为企业提升竞争力的关键。本文将深入浅出地探索智能运维的核心概念、技术应用以及它如何重塑IT管理的未来。通过具体案例,我们将一窥智能运维如何实现故障预测、自动化处理和持续优化,最终引领企业走向高效、稳定、创新的未来。
223 29
|
存储 SQL 算法
【动态规划】切割钢条详解python
【动态规划】切割钢条详解python
|
11月前
|
Java 程序员 C++
抽象类 vs 接口:如何在实际项目中做出正确选择?
小米讲解了Java中的抽象类和接口,分析了两者的异同及使用场景。抽象类适合共享状态和行为逻辑,接口适用于提供统一行为规范,尤其在多继承场景下。文中通过实例说明了如何选择使用抽象类或接口,帮助开发者更好地理解这两者在实际开发中的应用。
217 0
|
小程序
尝试使用阿里云服务器搭建微信小程序
华北电力大学核工程大一学生,出于对编程的热爱与大创项目需求,涉足微信小程序搭建。初期在实验指导下克服不熟悉编程的困难,但后期发现教程引导不足,尤其是对于代码定位缺乏清晰指引。建议加强网页图像指导,以适应不同编程水平用户,尤其是新手。
尝试使用阿里云服务器搭建微信小程序
|
11月前
|
计算机视觉 Python
Opencv学习笔记(十):opencv和base64之间的转换
本文介绍了如何使用Python和OpenCV库将图像在Base64编码和OpenCV可读格式之间进行转换。
417 0
|
机器学习/深度学习 人工智能 自然语言处理
3D智能导诊系统源码,基于AI引擎,针对患者的病情及症状,结合性别年龄特征,智能推荐医院科室
智能导诊系统是一款基于AI技术的医疗辅助工具,利用自然语言处理和机器学习分析患者病情,精准推荐科室和医生。系统支持按性别分类导诊,设有3D人体模型辅助定位症状,界面简洁易操作。采用B/S架构,可无缝对接HIS数据库,支持多种接入形式,包括公众号、小程序和App,有效提升就诊效率并减轻医护人员负担。
330 0
|
JavaScript 程序员 网络架构
vue路由从入门到进阶 --- 声明式导航详细教程
vue路由从入门到进阶 --- 声明式导航详细教程
vue路由从入门到进阶 --- 声明式导航详细教程