JVM(6)

news2024/9/29 5:27:37

JMM

JVM定义了一种Java内存模型来屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的内存访问效果.在此之前,C/C++直接使用物理硬件和操作系统的内存模型,因此,会由于不同平台下的内存模型差异,有可能导致程序在一套平台上并发完全正常,而在另一套平台上并发访问经常出错.

主内存和工作内存

Java内存模型的主要目标是定义程序中各个变量的访问规则,即在JVM中将变量存储到内存和从内存中取出变量这样的底层细节. 此处的变量包括实例字段,静态字段和构成数组对象的元素,但不包括局部变量和方法参数,因为后两者是线程私有的,不会被线程共享.

Java内存模型规定了所有的变量都存储在主内存中,每条线程还有自己的工作内存,线程的工作内存中保存了被该线程使用到的变量的主内存副本拷贝,线程对变量的所有操作(读取/赋值等)都必须在工作内存中进行,而不能直接读写主内存中的变量.不同线程之间也无法直接访问对方工作内存中的变量,线程间变量值的传递均需要通过主内存来完成.线程,主内存,工作内存三者的交互关系如下所示:

内存间的交互操作

关于主内存与工作内存之间的具体交互协议,即一个变量如何从主内存拷贝到工作内存,如何从工作内存同步回主内存之类的实现细节,Java内存模型中定义了如下8种操作来完成.JVM实现时必须保证下面提及的每一种操作是原子的,不可再分的.

 lock(锁定):作用于主内存的变量,它把一个变量标识为一条线程独占的状态.

unlock(解锁):作用于主内存的变量,它把一个处于锁定状态的变量释放出来,释放后的变量才可以被其它线程锁定.

read(读取):作用于主内存的变量,它把一个变量的值从主内存传输到线程的工作内存中,以便随后load动作使用.

load(载入):作用于工作内存的变量,它把read操作从主内存中得到的变量值放入工作内存的变量副本中.

use(使用):作用于工作内存中的变量,它把工作内存中一个变量值传递给执行引擎.

assign(赋值):作用于工作内存中的变量,它把一个从执行引擎接收到的值赋给工作内存变量.

store(存储):作用于工作内存中的变量,它把工作内存中一个变量的值传送到主内存中,以便后续write操作的使用.

write(写入):作用于主内存中的变量,它把store操作从工作内存中得到变量的值放入主内存的变量中.

 Java内存模型的三大特性:

原子性:由Java内存模型来直接保证的原子性变量操作包括read, load, assign, use, store和read.大致可以认为,基本数据类型的访问读写是具备原子性的.如果需要更大范围的原子性,需要synchronized关键字约束.(即一个操作或者多个操作要么全部执行并且执行的过程不会被任何因素打断,要么都不执行).

可见性:可见性是指当一个线程修改了共享变量的值,其它线程能够立即得知这个修改.volatile,synchronized,final三个关键字可以实现可见性.

有序性:如果在本线程内观察,所有的操作都是有序的;如果在线程中观察另一个线程,所有的操作都是无序的.前半句是指"线程内表现为串行",后半句是指"指令重排序"和"工作内存和主内存同步延迟现象".

Java内存模型具备一些先天的"有序性",即不需要通过任何手段就能够得到保证的有序性,这个通常也称为happens-before原则.如果两个操作的执行次序无法从happens-before原则推导出来,那么它们就不能够保证它们的有序性,虚拟机可以随意地对它们进行重排序.

下面就来具体介绍一下happens-before原则(现行发生原则):

程序次序规则:一个线程内,按照代码顺序,书写在前面的操作现行发生于书写在后面的操作.

锁定规则:一个unLock操作先行发生于后面对同一个锁的lock操作.

volatile变量规则:对一个变量的写操作先行发生于后面对这个变量的读操作.

传递规则:如果操作A现行发生于操作B,而操作B又现行发生于操作C,则可以得出操作A现行发生于操作C

线程启动规则:Thread对象的start()方法先行发生于此线程的每一个动作.

线程中断规则:对线程interrupt()方法的调用先行发生于被中断线程的代码.

线程终结规则:线程中所有的操作都先行发生于线程的终止检测,我们可以通过Thread.join()方法结束,Thread.isAlive()的返回值手段检测到线程已经终止运行.

对象终结规则:一个对象的初始化完成先行于它的finalize()方法(用于在对象被垃圾回收器回收之前执行一些清理操作)的开始. 

也就是说,想要并发程序正确地执行,必须要保证原子性,可见性以及有序性.只要有一个没有被保证,就有可能会导致程序运行不正确

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Unity曲柄滑块四杆机构运动计算

一、运动效果 二、机构的介绍 曲柄长度:a,线段AB长度 连杆长度:b,线段BC长度 偏心距离:e,滑块轨迹与曲柄中心点A的垂直距离 三、已知点A点B和e的值,计算C点的位置 1、计算s的值 var h math.…

绝望的C#:Task是个良好的设计吗?

我对高级语言的异步机制总感到理解起来比较困难。明确的创建任务、等待任务不好吗? 执行异步调用的方法返回一个Task是很正常的,很容易理解,但是Task.Result为什么导致阻塞呢? 一个属性,而不是一个方法,竟然…

Python算法题集_单词搜索

Python算法题集_单词搜索 题22:单词搜索1. 示例说明2. 题目解析- 题意分解- 优化思路- 测量工具 3. 代码展开1) 标准求解【原始矩阵状态回溯】2) 改进版一【字典检测原始矩阵状态回溯】3) 改进版二【矩阵状态回溯】 4. 最优算法5. 相关资源 本文为Python算法题集之一…

鸿蒙开发案例:进京赶考(5)完结

系列文章目录 鸿蒙开发案例:进京赶考(1) 鸿蒙开发案例:进京赶考(2) 鸿蒙开发案例:进京赶考(3) 鸿蒙开发案例:进京赶考(4) 鸿蒙开…

ifcplusplus 示例 函数中英文 对照分析以及流程图

有需求,需要分析 ifc c渲染,分析完,有 230个函数,才能完成一个加载,3d加载真的是大工程! 示例代码流程图 函数中英文对照表,方便 日后开发,整理思路顺畅!!&am…

KubeSphere平台安装系列之三【Linux多节点部署KubeSphere】(3/3)

**《KubeSphere平台安装系列》** 【Kubernetes上安装KubeSphere(亲测–实操完整版)】(1/3) 【Linux单节点部署KubeSphere】(2/3) 【Linux多节点部署KubeSphere】(3/3) **《KubeS…

个人项目介绍2:地球卫星篇

项目需求: 在项目中显示三维地球及主要城市标注,接收服务端发来的实施卫星数据,显示卫星姿态角,陀螺角,飞轮等数据;可自定义模拟产生更多卫星轨迹;可模拟显示卫星躲避陨石动画;可展…

【文献管理】zotero插件4——获取知网pdf、中文文献识别与目录生成

文章目录 zotero获取知网PDFzotero——中文文献识别(茉莉花插件)学位论文目录生成 zotero获取知网PDF zotero——中文文献识别(茉莉花插件) 为下载的学位论文添加目录中文文献识别:jasminum 下载pdflabs下载茉莉花插…

标准库中的String类 String(C++)【3】

文章目录 String常用的接口(黑框标记的是常用接口)数据访问operator:at:back:front: 数据修改push_back:append:operator:assigen:insert:erase:replace:注意事项 String常用的接口(黑框标记的是常用接口) 数据访问 operator: 返…

智能物联时代下RFID技术在汽车零部件智能制造中的引领作用

RFID(Radio Frequency Identification,射频识别)技术在汽车零部件加工中有广泛的应用,其工作原理是通过无线电频率进行自动识别。在汽车零部件加工中,RFID技术可以发挥重要作用,提高生产效率、降低成本和减…

【5G 接口协议】GTP-U协议介绍

博主未授权任何人或组织机构转载博主任何原创文章,感谢各位对原创的支持! 博主链接 本人就职于国际知名终端厂商,负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作,目前牵头6G算力网络技术标准研究。 博客…

【虚拟机安装centos7后找不到网卡问题】

最近开始学习linux,看着传智播客的教学视频学习,里面老师用的是centos6.5,我这边装的是centos7最新版的 结果到了网络配置的这一节,卡了我好久。 我在centos一直找不到我的网卡eth0,只有一个回环网口,在/…

集成2.5G/5G/10G高速率网络变压器的RJ45网口连接器产品特点介绍

Hqst华轩盛(石门盈盛)电子导读:集成2.5G/5G/10G高速率网络变压器的RJ45网口连接器产品特点介绍: 第一、 高速率:支持高达2.5Gbps、5Gbps和10Gbps的传输速率,能够满足高带宽的网络应用需求。 第二、 集成2.5G/5G/10G高速率网…

编写dockerfile挂载卷、数据容器卷

编写dockerfile挂载卷 编写dockerfile文件 [rootwq docker-test-volume]# vim dockerfile1 [rootwq docker-test-volume]# cat dockerfile1 FROM centosVOLUME ["volume01","volume02"]CMD echo "------end------" CMD /bin/bash [rootwq dock…

Spring框架相关问题

Spring框架相关问题 一、Spring容器中的Bean是线程安全的吗?二、如何保证Spring容器中的Bean是线程安全的呢?三、什么情况下会触发Spring事务回滚?四、如果事务方法抛出IOException,是否会触发Spring事务回滚?五、什么…

在线简历制作网站免费推荐收藏备用

今天给大家推荐一个很实用的网站,对于要毕业的同学或者说跳槽的朋友比较有作用,对,就是一个免费方便的在线简历制作网站。其实免费的简历制作网站很多,但好用的良心的其实并不多,今天要推荐的这个虽然模板不算多&#…

1.2 在卷积神经网络中,如何计算各层感受野的大小

1.2 在卷积神经网络中,如何计算各层感受野的大小 分析与解答: 在卷积神经网络中,由于卷积的局部连接性,输出特征图上的每个节点的取值,是由卷积核在输入特征图对应位置的局部区域内进行卷积而得到的,因此这…

sql注入之sqli-labs/less-3 单引号加括号闭合

输入单引号试探: id1 报错信息里面出现 ) 说明闭合符合里面还有个 ) 再次试探:id1 ) order by 3 -- 查看回显位置: id-1%20%27)%20union%20select%201,2,3%20-- 查看数据库: id-1%20%27)%20union%20select%201,2,database()%2…

PDF 解析问题调研

说点真实的感受 :网上看啥组件都好,实际测,啥组件都不行。效果好的不开源收费,开源的效果不好。测试下来,发现把组件融合起来,还是能不花钱解决问题的,都是麻烦折腾一些。 这里分享了目前网上能…

幻兽帕鲁专用服务器搭建之Linux部署配置教程

大家好我是飞飞,上一期我分享了Windows系统的幻兽帕鲁服务器搭建教程。因为幻兽帕鲁这游戏对服务器的配置有一定的要求,很多小伙伴就寻思用Linux系统搭建占用会不会小一点?有计算机基础的小伙伴都知道Linux系统和Windows系统相比,…