Java内存模型之happens-before
happens-before规则来源于Leslie Lamport《Time, Clocks and the Ordering of Events in a Distributed System》。该论文中使用happens-before来定义分布式系统中事件之间的偏序关系(partial ordering),该文中给出了一个分布式算法,能用来将偏序关系扩展为某种全序关系。JSR-133使用ha
happens-before是JMM的核心概念。理解happens-before是了解JMM的关键。
1、设计意图
JMM的设计需要考虑两个方面,分别是程序员角度和编译器、处理器角度:
-
程序员角度,希望内存模型易于理解、易于编程。希望是一个强内存模型。
-
编译器和处理器角度,希望减少对它们的束缚,以至于编译器和处理器可以做更多的性能优化。希望是一个弱内存模型。
因此JSR-133专家组设计JMM的核心目标就两个:
-
为程序员提供足够强的内存模型
-
对编译器和处理器的限制尽可能少
下面通过一段代码来看JSR-133如何实现这两个目标:
double pi = 3.14; //A
double r = 1.0; //B
double area = pi * r * r //C
上述代码存在如下happens-before关系:
-
A happens-before B
-
B happens-before C
-
A happens-before C
这3个happens-before关系中,第二个和第三个是必须的,而第一个是非必须的(A、B操作之间重排序,程序执行结果不会发生改变)。
JMM把happens-before要求禁止的重排序分为下面的两类:
-
会改变程序执行结果的重排序
-
不会改变程序执行结果的重排序
JMM对这两种不同性质的重排序,采取了不同的策略:
-
对于会改变程序执行结果的重排序,JMM要求编译器和处理器必须禁止
-
对于不会改变程序执行结果的重排序,JMM不做要求(JMM运行)
JMM设计示意图:
JMM设计示意图
总结:
-
JMM给程序员提供的happens-before规则能满足程序员的需求。简单易懂,具有足够强的内存可见性保证。
-
JMM对编译器和处理器的束缚尽可能少。遵循的原则是:不改变程序的执行结果(正确同步或单线程执行),编译器和处理器可以任意优化。
2、happens-before的定义
起源:
happens-before规则来源于Leslie Lamport《Time, Clocks and the Ordering of Events in a Distributed System》。该论文中使用happens-before来定义分布式系统中事件之间的偏序关系(partial ordering),该文中给出了一个分布式算法,能用来将偏序关系扩展为某种全序关系。
Java中的应用:
JSR-133使用happens-before来指定两个操作之间的执行顺序。JMM可以通过happens-before关系向程序员提供跨线程的内存可见性保证。
《JSR-133:Java Memory Model and Thread Specification》对happens-before关系的定义如下:
-
如果操作A happens-before 操作B,那么A操作的执行结果将会对操作B可见,且操作A的执行顺序排在操作B之前——JMM对程序员的承诺
-
两个操作存在happens-before关系,并不意味着Java平台的具体实现必须按照happens-before的顺序来执行。如果重排序不改变程序执行结果(与happens-before)规则一致,那么这种重排序是不非法的(JMM允许这种重排序)。——JMM对编译器和处理器的束缚原则
happens-before和as-if-serial语义:
先自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以扫码领取!

最后
光给面试题不给答案不是我的风格。这里面的面试题也只是凤毛麟角,还有答案的话会极大的增加文章的篇幅,减少文章的可读性
Java面试宝典2021版
最常见Java面试题解析(2021最新版)
2021企业Java面试题精选
(img-WGiYmZVo-1711378774245)]
[外链图片转存中…(img-Cxw4cI2m-1711378774245)]
2021企业Java面试题精选
[外链图片转存中…(img-Lw9wuKHr-1711378774245)]
[外链图片转存中…(img-7BPKWCeC-1711378774245)]
需要更多Java资料的小伙伴可以帮忙点赞+关注,点击传送门,即可免费领取!

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。
更多推荐
所有评论(0)