多线程:happens-before 先行发生原则
下面就来具体介绍下happens-before原则(先行发生原则):
这8条规则中,前4条规则是比较重要的,后4条规则都是显而易见的。
下面我们来解释一下前4条规则:
对于程序次序规则来说,我的理解就是一段程序代码的执行在单个线程中看起来是有序的。注意,虽然这条规则中提到“书写在前面的操作先行发生于书写在后面的操作”,这个应该是程序看起来执行的顺序是按照代码顺序执行的,因为虚拟机可能会对程序代码进行指令重排序。虽然进行重排序,但是最终执行的结果是与程序顺序执行的结果一致的,它只会对不存在数据依赖性的指令进行重排序。因此,在单个线程中,程序执行看起来是有序执行的,这一点要注意理解。事实上,这个规则是用来保证程序在单线程中执行结果的正确性,但无法保证程序在多线程中执行的正确性。
指令重排序会导致在多线程情况下的有序性混乱,从而影响计算结果的正确性
第二条规则也比较容易理解,也就是说无论在单线程中还是多线程中,同一个锁如果出于被锁定的状态,那么必须先对锁进行了释放操作,后面才能继续进行lock操作。
第三条规则是一条比较重要的规则,也是后文将要重点讲述的内容。直观地解释就是,如果一个线程先去写一个变量,然后一个线程去进行读取,那么写入操作肯定会先行发生于读操作。
第四条规则实际上就是体现happens-before原则具备传递性。
多线程:happens-before 先行发生原则相关推荐
- JAVA多线程之先行发生原则
一.引子 如果java内存模型中所有的有序性都仅仅依靠volatile和synchronized来完成,那么有一些操作会变得很繁琐,但我们在编写java并发代码时并未感觉到这一点,这是因为java语言 ...
- 【Java 并发编程】指令重排序规范 ( happens-before 先行发生原则 )
文章目录 一.指令重排序规范 二.happens-before 先行发生原则 一.指令重排序规范 指令重排指的是 , 线程中如果两行代码 没有逻辑上的上下关系 , 可以对代码进行 重新排序 ; JVM ...
- volatile、synchronized、(原子、可见、有序)、先行发生原则
Java代码---编译--->Java字节码---类加载器加载到JVM中--->汇编指令(在CPU上执行) Java中的并发机制依赖于JVM的实现和CPU指令 1.volatile 轻量级 ...
- java内存模型—先行发生原则
Java语言中有一个"先行发生"(happens-before)的原则.这个原则非常重要,它是判断数据是否存在竞争,线程是否安全的主要依据,依赖这个原则,我们可以通过几条规则一揽子 ...
- 先行发生原则(happens-before)介绍
一.什么是先行发生原则 二.Java内存模型中的先行发生关系 三.如何应用先行发生规则 如果Java内存模型中所有的有序性都仅仅靠volatile和synchronized来完成,那么有一些操作将会变 ...
- 先行发生原则-Happends-Before
先行发生原则--Happens-Before 先行发生原则是判断数据是否存在竞争,线程是否安全的有效手段.先行发生是Java内存模型中定义的两项操作之间的偏序关系,比如说操作A先行发生于操作B,其实就 ...
- 高效并发-先行发生原则
先行发生原则 这个原则非常重要,它是判断数据是否存在竞争.线程是否安全的主要依据,依靠这个原则,我们可以通过几条规则一揽子地解决并发环境写两个操作之间是否可能存在冲突的所有问题. 以下是java内存模 ...
- Happens-Before 先行发生原则
目录 先行发生是Java内存模型中定义的两项操作之间的偏序关系. 程序次序规则(Program Order Rule) 管程锁定规则(Monitor Lock Rule) volatile 变量规则( ...
- 深入探索JVM高效并发 — Java内存模型(四) 先行发生原则
先行发生原则 Java语言中有一个"先行发生"(Happens-Before)的原则.这个原则非常重要,它是判断数据是否存在竞争,线程是否安全的非常有用的手段. 依赖这个原则,我们 ...
最新文章
- [Leetcode]100. Same Tree -David_Lin
- 查找字符位置_Excel中查找字符第N次出现的位置信息,换个思路其实很简单
- Tomcat的账号与密码
- SpringBoot自动化配置之一:SpringBoot内部的一些自动化配置原理
- java 友好时间显示_仿微信的IM聊天时间显示格式(含iOS/Android/Web实现)[图文+源码]...
- 线性表之链式存储结构_单链表相关算法
- 【bzoj3456】城市规划(多项式求逆+dp)
- 微信小程序登录界面的实现
- 5分钟快速学会使用Swiper.js,实现轮播图各种效果!
- BZOJ5287 HNOI2018毒瘤
- 前端中文输入法对剩余字数计算的影响
- 火车头采集器V10下载-火车头采集器免费
- 【SQL】神奇的DUAL表
- 公司年会上进版小品——谁杀死了周日
- 解决:网络文件夹目前是以其他用户名和密码进行映射的
- 暗黑破坏神练Key方法详解
- linux查找文件并替换文件名字符串
- android应用编译失败 ResXMLTree_node size 类错误,以及 android studio 项目内搜索
- Vue加载中(Spin)
- 为什么宝宝腹泻就一定要用中性乳糖酶?
热门文章
- java 线程的几种状态
- Educational Codeforces Round 13 E. Another Sith Tournament 状压dp
- swift 注意事项 (十六) —— 可选链
- abstract class与interface的差异
- 我看Chrome超越IE的意义
- 【机器学习】基于opencv实现目标检测,error LNK2001: unresolved external symbol public: virtual bool CvSVM::train...
- 基于opengl的复杂图形三维建模实现
- Memcache工作原理总结
- H3C S6800交换机基本配置命令
- pythonbreak语句教程_Python break语句详解