【JUC】十七、JMM下的三大特性

文章目录

  • 1、JMM的背景
  • 2、Java Memory Model
  • 3、JMM规范下的三大特性
    • 可见性
    • 原子性
    • 有序性
  • 4、多线程对变量的读写过程
  • 5、总结

1、JMM的背景

如图,对于磁盘、内存、CPU等硬件,内存和CPU的运行速度不是一个量级的,不能总让CPU等着内存,因此,在CPU和内存之间,出现了一个高速缓存(CPU的一二三级缓存)。

在这里插入图片描述

CPU的运行并不是直接操作内存,而是先把内存里边的数据读到高速缓存,再让高速缓存去和内存沟通,此时,就会出现,写完了,但读内存时还没从高速缓存中同步过来的情况,即读写不一致的问题。

在这里插入图片描述

基于此,JVM中定义了一种Java的内存模型,Java Memory Model,即JMM,用来屏蔽各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台或者操作系统下,都能达到一致的内存访问效果。

2、Java Memory Model

  • JMM本身是一种抽象概念,并不真实存在(不是内存条一样的可以摸到)
  • JMM是一组约定或规范
  • 规范中定义了程序中各个变量的读写访问方式
  • 规范中定义了一个线程对共享变量的写入何时以及如何变成对另一个线程可见
  • JMM的关键技术点都是围绕多线程的原子性、可见性、有序性展开

JMM作用是:

  • 实现CPU(线程)和主内存之间的抽象关系
  • 屏蔽硬件和操作系统的内存访问差异,实现Java程序在各个平台下都能达到一致的内存访问效果

3、JMM规范下的三大特性

  • 可见性
  • 原子性
  • 有序性

可见性

指当一个线程修改了某一个共享变量的值,其他的线程能都立即知道该变更JMM规定了所有的变量都存储在主内存中。

在这里插入图片描述

public class Dog{

	private int age;

}

现在new一个Dog对象,多个线程共享操作这个对象(比如修改这个对象的age属性),共享变量在主内存中有且仅有一份,如果A线程想把age属性从5改成6,它不能直接去操作主内存,而是先把这个共享变量读到线程A自己所持有的本地内存里,也就是共享变量的副本,改完后再提交写回主内存。现在A线程改完了,我要让其他线程马上知道:我写到主内存了,你们可以去主内存当中读取最新的数据了,这就是可见性。

每个线程都有自己的工作内存,线程自己的工作内存中保存了该线程使用到的变量的主内存副本拷贝,线程对变量的所有操作(读取,赋值等) 都必须在线程自己的工作内存中进行,而不能够直接读主内存中的变量。不同线程之间也无法直接访问对方工作内存中的变量,线程间变量值的传递均需要通过主内存来完成。
在这里插入图片描述
核心词语:工作内存、主内存、主内存副本拷贝

原子性

指一个操作是不可打断的(不可再分,不可打断,所以起名原子),即多线程环境下,操作不能被其他线程干扰。比如A、B两个线程共同操作变量x:

在这里插入图片描述

关键点:

  • A线程要将更改后的x从自己的工作内存刷回主内存时,被挂起了,没来的及将更新后的值写回主内存
  • B线程去读 ,你以为是x=1,B线程再+1应该得2,但最后却从主内存读到0,x+1 = 1

以上的问题,是系统主内存共享变量数据在线程自己的工作内存中修改后,被写入主内存的时机是不确定的,多线程并发下很可能出现"脏读"。加入原子性,工作内存修改完成和写入主内存这两个操作别再分,就不会有这个问题。

有序性

代码从上往下执行,这是基础知识,但为了提升性能,编译器和处理器会对指令序列进行重排序,JVM内部维持顺序化语义,只要程序的最终结果与它顺序化执行的结果一样,那指令的执行顺序可以和代码顺序不一致,即指令的重排序。

在这里插入图片描述

指令重排序的优缺点:

  • 优点:使得指令更复合CPU特性,最大限度发挥性能
  • 缺点:指令重排保证了串行语义的一致,但不保证多线程下的语义一致,可能产生脏读

总之,指令重排是为了程序的性能最佳,比如计算2+1+3,在Linux下运算1+2+3快,而在Windows下运算3+2+1快,二者与最终的计算结果都想到,允许指令重排,但这一切的前提是正确性,所以有的时候要根据特殊场景的业务情况,来禁止指令重排,以保证程序执行的有序性。

public void mySort(){

	int x = 11;  //语句1

	int y = 12;  //语句2
	
	x = x + 5;  //语句3
	
	y = x*x;   //语句4
}

此时,1234、2134的顺序都行(当然这里没写编译处理后的指令,用代码代替表达含义)。但语句4不能重排后变成第一条了,变量都没定义,怎么用,即数据的依赖性。

4、多线程对变量的读写过程

由于JVM运行程序的实体是线程,而每个线程创建时JVM都会为其创建一个工作内存(也称为栈空间),工作内存是每个线程的私有数据区域,而Java内存模型中规定所有变量都存储在主内存,主内存是共享内存区域,所有线程都可以访问,但线程对变量的操作读取赋值等)必须在工作内存中进行,所以正确的操作流程是:首先要将变量从主内存拷贝到的线程自己的工作内存空间,然后对变量进行操作,操作完成后再将变量写回主内存,不能直接操作主内存中的变量,各个线程中的工作内存中存储着主内存中的变量副本拷贝,因此不同的线程间无法访问对方的工作内存,线程间的通信(传值)必须通过主内存来完成,如下图:

在这里插入图片描述

JMM定义了线程和主内存之间的抽象关系:

  • 线程之间的共享变量存储在主内存,从硬件角度来说就是内存条)
  • 每个线程都有一个私有的本地工作内存,本地内存中存储了该线程用来读/写共享变量的副本(从硬件角度来说就是CPU的缓存,比如寄存器、L1、L2、L3缓存)

5、总结

  • 我们定义的所有共享变量都储存在物理主内存中
  • 每个线程都有自己独立的工作内存,里面保存该线程使用到的变量的副本(主内存中该变量的一份拷贝)
  • 线程对共享变量所有的操作都必须先在线程自己的工作内存中进行后写回主内存,不能直接从主内存中读写(不能越级)
  • 不同线程之间也无法直接访问其他线程的工作内存中的变量,线程间变量值的传递需要通过主内存来进行(同级不能相互访问)

最后,JMM对这三大特性保证的底座就是happens-before规则

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/204321.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java 数据结构篇-用链表、数组实现栈

🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录 1.0 栈的说明 2.0 用链表来实现栈 2.1 实现栈 - 入栈方法(push) 2.2 实现栈 - 出栈(pop) 2.3 实现栈 - 查看栈顶元素…

[个人笔记] Zabbix实现Webhook推送markdown文本

系统工程 - 运维篇 第四章 Zabbix实现Webhook推送markdown文本 系统工程 - 运维篇系列文章回顾Zabbix实现Webhook推送markdown文本前言实施步骤 Zabbix新增报警媒介类型Zabbix给用户新增报警媒介Zabbix修改动作的执行操作和恢复操作验证&测试 参考来源 系列文章回顾 第一章…

赤霞珠葡萄酒的风味特征是怎样的?

赤霞珠最值得注意的特点之一是它在发酵或桶陈酿期间对橡木的亲和力,除了对葡萄的天然高单宁产生软化效果外,香草和香料的独特木材风味还补充了黑醋栗和烟草的天然葡萄风味。 来自云仓酒庄品牌雷盛红酒分享基于赤霞珠的波尔多混合物在225升(59…

【vue_1】console.log没有反应

1、打印不出来?2、警告也会出现问题3、插播:如何使用if-else 语句来处理逻辑 1、打印不出来? 要做一个权限不够的弹出消息框 const authority_message () > {ElMessage({type: warrnings,message: 当前用户的权限不够});console.log(he…

neo4j使用之超神之旅

1.查询整个链路中任意一段的关系类型是“department”的链路数据 MATCH path (n)-[r1 *0..7 {relation_type:once2once}]-(m) where id(n)0 and any(x in relationships(path) where type(x)department) return path效果图: 2.查询整个链路中最后一段的关系类型…

ROS报错:RLException:Invalid roslaunch XML Syntax: mismatched tag:

运行roslaunch文件提示&#xff1a; RLException:Invalid roslaunch XML Syntax: mismatched tag: line 45&#xff0c; column 2 The traceback for the exception was written to the log file. j 解决办法&#xff1a; line45 行多了标签&#xff1a;</node> 另外…

拓数派荣获上海市“智慧工匠”工业软件创新案例奖

近日&#xff0c;由上海市经济和信息化委员会指导、上海市城市数字化转型应用促进中心主办、上海中创产业创新研究院承办的“工业软件赋能新型工业化”主题沙龙暨2023“智慧工匠”工业软件创新案例竞赛颁奖典礼在上海圆满落幕。拓数派凭借上汽集团工业数据管理服务平台案例成功…

深度学习大数据物流平台 python 计算机竞赛

文章目录 0 前言1 课题背景2 物流大数据平台的架构与设计3 智能车货匹配推荐算法的实现**1\. 问题陈述****2\. 算法模型**3\. 模型构建总览 **4 司机标签体系的搭建及算法****1\. 冷启动**2\. LSTM多标签模型算法 5 货运价格预测6 总结7 部分核心代码8 最后 0 前言 &#x1f5…

绝地求生PUBG提示msvcp140.dll缺失的5个解决方法,亲测有效

在玩《绝地求生》这款游戏时&#xff0c;我们可能会遇到各种各样的问题。其中之一就是“吃鸡提示msvcp140.dll缺失怎么办”。这个问题可能导致游戏无法正常启动运行&#xff0c;但是不用担心&#xff0c;下面我将为大家详细介绍如何解决这个问题。 msvcp140.dll文件的概述 msv…

如何利用树莓派与Nginx结合内网穿透服务实现远程访问内部站点——“cpolar内网穿透”

文章目录 1. Nginx安装2. 安装cpolar3.配置域名访问Nginx4. 固定域名访问5. 配置静态站点 安装 Nginx&#xff08;发音为“engine-x”&#xff09;可以将您的树莓派变成一个强大的 Web 服务器&#xff0c;可以用于托管网站或 Web 应用程序。相比其他 Web 服务器&#xff0c;Ngi…

【产品功能】dolphinscheduler怎么修改,实现超时就结束掉当前工作流

超时就结束工作流 代码 代码 MasterExecThread类 的 runProcess方法 里面有超时告警&#xff0c;原本里面只有超时告警的&#xff0c;这时候我只要加上海豚自己写好的结束任务的方法endProcess&#xff08;&#xff09;方法

视频监控平台EasyCVR多场景应用,AI视频分析技术助力行业升级转型

传统的视频监控系统建设&#xff0c;经常存在各方面的因素制约&#xff0c;造成管理机制不健全、统筹规划不到位、联网共享不规范&#xff0c;形成“信息孤岛”、“数据烟囱”。在监控系统的建设中缺乏统一规划&#xff0c;标准不统一、视频图像信息利用率低等问题日益突出。随…

7款趣味性不错的前端特效动画及源码分享(附源码)

鼠标悬停切换表情动画特效 基于CSS的transform属性制作鼠标悬停切换表情动画特效&#xff0c;默认为笑脸表情&#xff0c;鼠标悬停上去切换爱心眼睛色眯眯的表情。 预览获取 核心代码 <!DOCTYPE html> <html lang"en"> <head><meta charset&…

【C++】C++11

一、C11 简介 C11 - cppreference.com 在 2003 年 C 标准委员会曾经提交了一份技术勘误表&#xff08;简称TC1&#xff09;&#xff0c;使得 C03 这个名字已经取代了 C98 称为 C11 之前的最新 C 标准名称。不过由于 C03&#xff08;TC1&#xff09;主要是对 C98 标准中的漏洞进…

智能遥测终端机RTU的注意事项

智能遥测终端机RTU是一种用于实时监测和控制现场数据的设备&#xff0c;可以广泛应用于水利、水文、电力、煤炭等各个领域。但是在使用智能遥测终端机RTU时&#xff0c;也需要注意一些事项&#xff0c;以确保终端的正常使用效果。 ◆注意安装位置   应安装在稳定、通风的室内…

虚幻学习笔记4—文本内容处理

一、前言 本文使用的虚幻引擎5.3.2&#xff0c;在虚幻中已经集成了很多可以直接处理多样化文本的蓝图&#xff0c;比如格式化动态显示、浮点数多样化等。 二、实现 2.1、格式化文本显示动态内容&#xff1a;在设置某个文本时可以使用“Format Text”蓝图设置自定义可以的显示…

企业怎么在社交媒体进行软文推广?媒介盒子为你支招

数字化时代下&#xff0c;社交媒体已经成为企业进行营销推广的重要渠道&#xff0c;在社交媒体进行软文推广&#xff0c;能够提高企业的知名度与曝光度&#xff0c;还能更好地吸引用户关注&#xff0c;从而实现推广目标。但是想要在社交媒体上进行宣传&#xff0c;软文内容是十…

智能工厂是什么?

今天就聊聊企业智能工厂的打造&#xff0c;企业想实现数字化转型建立智能工厂&#xff0c;就需要先建设数字化车间&#xff0c;可以说数字化车间是建设智能工厂的重要一环&#xff0c;智能工厂的基础是数字化车间。数字化车间可以实现企业生产过程中车间计划调度、工艺执行管理…

zookeeper 单机伪集群搭建简单记录(实操课程系列)

本系列是zookeeper相关的实操课程&#xff0c;课程测试环环相扣&#xff0c;请按照顺序阅读测试来学习zookeeper 1、官方下载加压后&#xff0c;根目录下新建data和log目录&#xff0c;然后分别拷贝两份&#xff0c;分别放到D盘&#xff0c;E盘&#xff0c;F盘 2、data目录下面…

分类模型的评价指标

分类模型有时候光靠loss和acc的指标太过于片面&#xff0c;不能很好全面的评判训练出来的模型。所以还需要分类报告、混淆矩阵、ROC曲线&#xff08;AUC的值&#xff09;等几个指标进行评判&#xff0c;本文主要用代码简洁的介绍如何得出这些指标。 首先要得到每个数据的真实值…