先行发生原则(Happen-before)
先行发生是Java内存模型中定义的两项操作之间的偏序关系,如果说操作A先行发生于操作B,其实就是说在发生操作B之前,操作A所产生的影响能被操作B观察到,“影响”包括修改了内存中共享变量的值,发送了消息,调用了方法等。
Java内存模型中“天然的”先行发生关系:
1) 程序次序规则(Program Order Rule)
在同一个线程内,程序代码里写在前面的操作先行发生于写在后面的代码。准确地说,因该是控制流顺序而不是程序代码顺序,因为要考虑分支,循环等结构。
2) 管程锁定规则(Monitor Lock Rule)
对某个锁的unlock操作先行发生于后面对同一个锁的lock操作。这里必须强调的是同一个锁,这里的“后面”是指时间上的先后顺序。也就是说,如果某个锁已经被lock了,那么只有它被unlock之后,其他线程才能lock该锁。表现在代码上,如果是某个同步方法,如果某个线程已经进入了该同步方法,只有当这个线程退出了该同步方法(unlock操作),别的线程才可以进入该同步方法。
3) volatile变量规则(Volatile Variable Rule)
对一个volatile变量的写操作先行发生于对这个变量的读操作,这里的“后面”同样是指时间上的先后顺序。也就是说,某个线程对volatile变量写入某个值后,能立即被其它线程读取到。
4) 线程启动规则(Thread Start Rule)
Thread对象的start方法先行发生于此线程的每个动作。
5) 线程终止规则(Thread Termination Rule)
线程中的所有操作都先行发生于对此线程的终止检测,我们可以通过Thread.join()方法结束,Thread.isAlive()的返回值等手段检测到线程是否已经终止运行。
6) 线程中断规则(Thread Interruption Rule)
对线程interrupt()方法的调用先行发生于被中断线程的代码检测到中断事件的发生,可以通过Thread.interrupted()方法检测到是否有中断发生。
7) 对象终结规则(Finalizer Rule)
一个对象的初始化完成(构造函数执行结束)先行发生于它的finalize()方法的开始。
8) 传递性(Transitivity)
如果操作A先行发生于操作B,操作B先行发生于操作C,那就可以得出操作A先行发生于操作C的结论。
其中程序次序规则,管程锁定规则,volatile变量规则,传递性规则经常用来推断先行发生关系。
相关推荐
它的具体表现形式,包括但远不止是我们直觉中的 synchronized、volatile、lock 操作顺序等方面,例如:线程内执行的每个操作,都保证 happ
主要给大家介绍了关于Java利用happen-before规则实现共享变量的同步操作的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用java具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
一提到happens-before原则,就让人有点“丈二和尚摸不着头脑”。这个涵盖了整个JMM中可见性原则的规则,究竟如何理解,把我个人一些理解记录下来。下面可以和小编一起学习
Crashes Happen - Downtime Won't with Data Guard
使获取发生 是一个Node.js库,它包装了以及不想包含的其他功能,包括HTTP缓存支持,请求池,代理,重试! 安装 $ npm install --save make-fetch-happen 目录 fetch.defaults minipass-fetch选项 make-fetch-...
本文讲了Java并发编程中volatile变量、happens-before与内存一致性错误,下面来和小编一起学习下如何解决
happen-code Get into Leetcode~ Code List 动态规划 动态规划(英语:Dynamic programming,简称 DP)是一种在数学、管理科学、计算机科学、经济学和生物信息学中使用的,通过把原问题分解为相对简单的子问题的方式...
Project Make It Happen Extension是一个活动日历,可以帮助我们的团队随时了解最新事件,推送通知和每日激励中心。 通过单击第一个选项卡上包含的链接登录到您的后台。 单击第一个选项卡上的日历将跳至第二个选项卡...
ERP Make it Happen ERP Make it Happen ERP Make it Happen ERP Make it Happen
让它发生的例子 使其成为示例 入门 首先,您可以简单地克隆此存储库并安装所有必需的依赖项。 先决条件 您需要git来克隆MiHexample存储库。 您可以从获得git。 我们还使用了许多node.js工具来初始化和测试...
使获取发生 是一个Node.js库,该库将打包具有不打算包括的其他功能,包括HTTP缓存支持,请求池,代理,重试!安装$ npm install --save make-fetch-happen 目录例子const fetch = require ( 'make-fetch-happen' ) ....
有关ERP和SAP的使用中的经典案例,语言简单易懂,非常利于ERP和SAP的学习。
do before running Setup and information about using Windows, memory, and hardware with MS-DOS 5.0. It also contains updates to the User's Guide and Reference. For information about using ...
- Detect beats before they happen. - Create games like Rockband or AudioSurf. - Completely Customizable. - Easy to use. - Mobile Friendly - Well documented. - Tutorials provided. - 17 ...
- NEW: Added a validator delegate to the toggle class for when you want to add custom code to prevent state changes before they happen. - FIX: Some more compile fixes for newer Unity 5 versions. - FIX...
In the updated edition of this critically acclaimed and bestselling book Microsoft project veteran Scott Berkun offers a collection of essays on field tested philosophies and strategies for defining ...
本文主要介绍Java高并发内存模型和线程安全的资料,这里整理详细的资料及1.原子性 2.有序性 3.可见性 4.Happen-Before 5.线程安全的概念,有需要的小伙伴可以参考下
Project Make It Happen Extension是一个活动日历,可以帮助我们的团队随时了解最新事件,推送通知和每日激励中心。 通过单击第一个选项卡上包含的链接登录到您的后台。 单击第一个选项卡上的日历将跳至第二个选项卡...
java反编译 泄露源码 阿里、腾讯、百度、华为、京东、搜狗和滴滴最新面试题汇集 最后更新于20180513 ...2、简述happen-before规则; 3、JUC和Object;Monitor机制区别是什么;简述AQS原理; 4、简述