🌈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设计意图:
一对矛盾
1.程序员对内存模型的使用。程序员希望内存模型易于理解、易于编程。程序员希望基于一个强内存模型来编写代码
引出了一个平衡点:
由于这两个因素互相矛盾,所以JSR-133专家组在设计JMM时的核心目标就是找到一个 好的平衡点:
一方面,要为程序员提供足够强的内存可见性保证;
另一方面,对编译器和处理 器的限制要尽可能地放松。
下面让我们来看JSR-133是如何实现这一目标的。
代码讲解:
double pi = 3.14; // A
double r = 1.0; // B
double area = pi * r * r; // C
- ·会改变程序执行结果的重排序。
- ·不会改变程序执行结果的重排序。
- ·对于会改变程序执行结果的重排序(单线程),JMM要求编译器和处理器必须禁止这种重排序。
- ·对于不会改变程序执行结果的重排序,JMM对编译器和处理器不做要求(JMM允许这种重排序)。
图3-33是JMM的设计示意图。
5.2happens-before的定义
回顾定义:
从 JDK5 开始,JSR-133 使用 happens-before 来实现变量的内存可见性问题(一种实现协议与规约)。在 Java 内存模型中,happens-before 的意思是前一个操作的结果可以被后续操作获取。
意义:
5.3JSR-133
5.3.1两个原则
两个幻境!
· 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!!!
📚愿大家都能学有所得,功不唐捐!