Java内存模型-指令重排序&顺序一致性
章节目录
- 1.重排序定义
- 2.数据依赖性
- 3.as-if-serial语义
- 4.程序顺序规则
- 5.JMM 参考 顺序一致性内存模型的实践规范
1.重排序定义
重排序是指编译器和处理器为优化程序性能而对指令序列重新排序的一种手段。
2.数据依赖性
如果两个操作访问同一个变量,且两个操作中有一个为写操作,此时这两个操作之间就存在数据依赖性。
如下表所示,是我们常见的数据依赖性场景:
操作模式 | 代码示例 | 说明 |
---|---|---|
store->load | a=1; b=a; | 写一个变量后,再读这个位置 |
store->store | a=1; a=2 | 写一个变量之后,再写这个变量 |
load->store | a=b; b=1 | 读一个变量之后,再写这个变量 |
注意:
上述指令重排序之后,执行结果就会发生变化,所以编译器和处理器不会改变存在数据依赖关系的两个操作的执行顺序。仅针对于单个处理器中执行的指令序列和单个线程中执行的操作。
3.as-if-serial 语义
对于不存在数据依赖性的操作可以做指令重排序。as-if-serial语义把单线程程序保护了起来。
4.程序顺序规则
如果A happens-before B,注意happens-before定义的不是A,B操作执行的顺序是A先B后,,而是A操作的结果对B操作的结果可见,且A操作的结果按顺序排在B操作结果之前,所以进行指令重排序必须保证的前提是不改变程序执行结果。
5.JMM 参考 顺序一致性内存模型的实践规范
- 1.JMM采用共享内存模型通过通过控制共享内存与每个线程本地内存之间的交互,来提供内存可见性保证。
- 2.JMM通过指令重排序来优化程序执行性能,但不正确的重排序会破坏多线程程序的语义,程序运行结果出现非预想的情况。
- 3.JMM参考顺序一致性内存模型,(但不能完全实现,比如在非同步多线程程序下),来对正确同步的多线程程序做了如下保证-程序的执行结果与该程序在顺序一致性内存模型中的执行结果相同,但正确同步的多线程程序在执行过程中可以对临界区内不存在数据依赖的指令行进行重排序,以在保证执行结果正确的情况下通过指令重排序对程序运行性能做提升。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
异步5月新书,大咖云集本本经典(文末福利)
点击关注异步图书,置顶公众号 每天与你分享IT好书 技术干货 职场知识 参与文末话题讨论,每日赠送异步图书。 ——异步小编 5月小长假回来,小编带来了18本异步新书,这些新书涵盖热点领域Python、深度学习、CPU设计、微服务、少儿编程等领域。可以说本本重点。 有一种语言叫Python 《“笨办法学”Python3》基于Python3.6,支持手机扫码看视频。入门级 《Python编程从入门到精通》基于Python3,33小时视频讲解、900多案例分析。入门级 《Python数据分析(第2版)》基于Python3,畅销书升级版,入门级 《Python应用开发实战》基于Python3,以一个案例为主线解决实际问题,进阶级 《Python数据科学入门》基于Python3,掌握用Python编程进行数据分析的核心技能,入门级 有一种情怀叫自制CPU和编程语言 《手把手教你设计CPU——RISC-V处理器篇》一本介绍通用CPU设计的入门书,以通俗的语言系统介绍了CPU和RISC-V架构。入门级 《自制编程语言——基于C语言》手把手教你自制编程语言,入门级。 有一种能力叫“架构师” 《...
- 下一篇
Python学习轨迹 0503
今天,又回到了hello_world 好几天没有碰过就……什么都忘记了:( 还很丢人 我:师兄,这是环境变量没有设置好吗? (venv) C:\Users\dell\PycharmProjects\0503>hello_world 'hello_world'不是内部或外部命令,也不是可运行的程序或批处理文件。 师兄:不是吧,hello_world.py?如果是py 文件,要python hello_world.py。你是想执行这个文件吗? 我:是的 师兄:用python+文件名,python hello_world.py 我:我试试……还是不对 (venv) C:\Users\dell\PycharmProjects\0503>pyton helloworld pyhton:can't open file 'hello_world':[Errno 2] No such file or directory 师兄:求复制……你漏掉了.py 这个时候的我就超级尴尬了,只好说“啊我翻到了笔记,第一次学的时候犯了一样的错误,为什么忘得这么快?” 师兄:记住文件名都是有后缀的就好了,平...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS6,CentOS7官方镜像安装Oracle11G
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Windows10,CentOS7,CentOS8安装Nodejs环境
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Hadoop3单机部署,实现最简伪集群