《Java并发编程的艺术》第三章节Java内存模型2——happen-before原则

🌈hello,你好鸭,我是Ethan,西安电子科技大学大三在读,很高兴你能来阅读。

✔️目前博客主要更新Java系列、项目案例、计算机必学四件套等。
🏃人生之义,在于追求,不在成败,勤通大道。加油呀!

🔥个人主页:Ethan Yankang
🔥推荐:史上最强八股文||一分钟看完我的几百篇博客

🔥温馨提示:划到文末发现专栏彩蛋   点击这里直接传送

🔥本篇概览:详细讲解了《Java并发编程的艺术》第3章节Java内存模型2——happen-before原则。基于JSR<Java 内存模型和线程规范>详细说明了happen-before的定义、程序的产生的一对矛盾、从而引出了一个核心理念,JMM为此所做到的平衡点,为实现这个平衡点所遵守的两个原则。以及happen-before的6大基本规约等~~。🌈⭕🔥


【计算机领域一切迷惑的源头都是基本概念的模糊,算法除外】


👉Java并发编程专栏


🌈章节速览


5.happens-before

地位:

        happens-before是JMM最核心的概念。对应Java程序员来说,理解happens-before是理解 JMM的关键。

回顾定义:

        从 JDK5 开始,JSR-133 使用 happens-before 来实现变量的内存可见性问题(一种实现协议与规约)。在 Java 内存模型中,happens-before 的意思是前一个操作的结果可以被后续操作获取。

5.1JMM的设计

5.1.1设计意图:

JMM 设计 者的角度,在 设计 JMM ,需要 考虑两个 关键因素
一对矛盾

1.程序员对内存模型的使用。程序员希望内存模型易于理解、易于编程程序员希望基于一个强内存模型来编写代码

2.编译 器和 理器 内存模型的 实现 编译 器和 理器希望内存模型 对它们的束缚越少越好 ,这样 就可以做尽可能多的 化来提高性能。 编译器和处理器希望实现一个弱内存模型。

引出了一个平衡点:

        由于这两个因素互相矛盾,所以JSR-133专家组在设计JMM时的核心目标就是找到一个 好的平衡点:

一方面,要为程序员提供足够强的内存可见性保证;

另一方面,对编译器和处理 器的限制要尽可能地放松。


下面让我们来看JSR-133是如何实现这一目标的。

代码讲解:
double pi = 3.14; // A
double r = 1.0; // B
double area = pi * r * r; // C
上面 的面 的示例代 存在 3 happens-before 关系,如下。
·A happens-before B
·B happens-before C
·A happens-before C
3 happens-before 关系中, 2 3 是必需的,但 1 是不必要的。因此, JMM happens-before
要求禁止的重排序分了下面两类:
  • ·会改变程序执行结果的重排序。
  • ·不会改变程序执行结果的重排序。
JMM 对这 两种不同性 的重排序,采取了不同的策略,如下。
  • ·于会改程序果的重排序(单线程),JMM要求编译器和理器必禁止种重排序。
  • ·于不会改程序果的重排序,JMM对编译器和理器不做要求(JMM允许这种重排序)。

图3-33JMM设计示意


        ·JMM向程序 提供的 happens-before 规则 足程序 的需求。 JMM happens-before
不但 简单 易懂,而且也向程序 提供了足 的内存可 性保 (有些内存可 性保 并不一定真 存在,比如上面的 A happens-before B )。

5.2happens-before的定义

回顾定义:

        从 JDK5 开始,JSR-133 使用 happens-before 来实现变量的内存可见性问题(一种实现协议与规约)。在 Java 内存模型中,happens-before 的意思是前一个操作的结果可以被后续操作获取。

意义:

        JSR-133 使用happens-before的概念来指定两个操作之间的执行顺序(实现上述定义了) 。由于 两个操作可以在一个线 程之内,也可以是在不同 线 程之 。因此, JMM 可以通 happens-before 关系向程序员提供跨 线 程的内存可 性保 (如果 A 线 程的写操作 a B 线 程的 操作 b 存在 happens-before关系,尽管 a 操作和 b 操作在不同的 线 程中 行,但 JMM 向程序 a 操作将 b 操作可见) (这里就有几种手段,如三种同步原语等等!<可以作为一棵树向周围散开了>)。

5.3JSR-133

5.3.1两个原则

《JSR-133:Java Memory Model and Thread Specification》 happens-before 关系的定 如下。
1 )如果一个操作 happens-before 另一个操作,那么第一个操作的 果将 第二个操作可见 ,而且第一个操作的 序排在第二个操作之前。
2 )两个操作之 存在 happens-before 关系,并不意味着 Java 平台的具体 实现 要按照
happens-before 关系指定的 序来 行。如果重排序之后的 果,与按 happens-before 关系
行的 果一致,那么 种重排序并不非法(也就是 JMM 许这 种重排序)。
上面的 1 )是 JMM 程序 的承 。从程序 的角度来 ,可以 这样 理解 happens-before
系:如果 A happens-before B ,那么 Java 内存模型将向程序 ——A 操作的 果将 B
A 序排在 B 之前。注意, 只是 Java 内存模型向程序 做出的保
上面的 2 )是 JMM 对编译 器和 理器重排序的 束原 。正如前面所言, JMM 是在遵
循一个基本原 :只要不改 程序的 果(指的是 单线 程程序和正确同步的多 线 程程序), 编译 器和 理器怎么 化都行。 JMM 么做的原因是:程序 员对 两个操作是否真的被重
排序并不关心,程序 关心的是程序 语义 不能被改 (即 果不能被改 )。
此,happens-before关系本质上和as-if-serial语义是一回事。<树形可以散开,增加枝节>。

两个幻境! 

·        as-if-serial语义保证单线程内程序的执行结果不被改变,happens-before关系保证正确同 步的多线程程序的执行结果不被改变。

        as-if-serial语义给编写单线程程序的程序员创造了一个幻境:单线程程序是按程序的顺 序来执行的。

        happens-before关系给编写正确同步的多线程程序的程序员创造了一个幻境:正 确同步的多线程程序是按happens-before指定的顺序来执行的。

一个核心理念!

as-if-serial语义和happens-before这么做的目的,都是为了在不改变程序执行结果的前提 下,尽可能地提高程序执行的并行度。


5.4 happens-before规则

《JSR-133:Java Memory Model and Thread Specification》定义了如下happens-before规则。

1)程序顺序规则:一个线程中的每个操作,happens-before于该线程中的任意后续操作。

2)监视器锁规则:对一个锁的解锁,happens-before于随后对这个锁的加锁。

3)volatile变量规则:对一个volatile域的写,happens-before于任意后续对这个volatile域的读。

4)传递性:如果A happens-before B,且B happens-before C,那么A happens-before C。

5)start()规则:如果线程A执行操作ThreadB.start()(启动线程B),那么A线程的 ThreadB.start()操作happens-before于线程B中的任意操作。

6)join()规则:如果线程A执行操作ThreadB.join()并成功返回,那么线程B中的任意操作 happens-before于线程A从ThreadB.join()操作成功返回。


 


💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖

热门专栏推荐

🌈🌈计算机科学入门系列                     关注走一波💕💕

🌈🌈CSAPP深入理解计算机原理        关注走一波💕💕

🌈🌈微服务项目之黑马头条                 关注走一波💕💕

🌈🌈redis深度项目之黑马点评            关注走一波💕💕

🌈🌈JAVA面试八股文系列专栏           关注走一波💕💕

🌈🌈JAVA基础试题集精讲                  关注走一波💕💕   

🌈🌈代码随想录精讲200题                  关注走一波💕💕


总栏

🌈🌈JAVA基础要夯牢                         关注走一波💕💕  

🌈🌈​​​​​​JAVA后端技术栈                          关注走一波💕💕  

🌈🌈JAVA面试八股文​​​​​​                          关注走一波💕💕  

🌈🌈JAVA项目(含源码深度剖析)    关注走一波💕💕  

🌈🌈计算机四件套                               关注走一波💕💕  

🌈🌈数据结构与算法                           ​关注走一波💕💕  

🌈🌈必知必会工具集                           关注走一波💕💕

🌈🌈书籍网课笔记汇总                       关注走一波💕💕         



📣非常感谢你阅读到这里,如果这篇文章对你有帮助,希望能留下你的点赞👍 关注❤收藏✅ 评论💬,大佬三连必回哦!thanks!!!
📚愿大家都能学有所得,功不唐捐!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值