`
cfyme
  • 浏览: 263685 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

先行发生原则happen-before

 
阅读更多

先行发生原则(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变量规则,传递性规则经常用来推断先行发生关系。

 

分享到:
评论

相关推荐

    第29讲Java内存模型中的happen-before1

    它的具体表现形式,包括但远不止是我们直觉中的 synchronized、volatile、lock 操作顺序等方面,例如:线程内执行的每个操作,都保证 happ

    Java利用happen-before规则如何实现共享变量的同步操作详解

    主要给大家介绍了关于Java利用happen-before规则实现共享变量的同步操作的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用java具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    深入浅出了解happens-before原则

    一提到happens-before原则,就让人有点“丈二和尚摸不着头脑”。这个涵盖了整个JMM中可见性原则的规则,究竟如何理解,把我个人一些理解记录下来。下面可以和小编一起学习

    Crashes Happen - Downtime Won't with Data Guard

    Crashes Happen - Downtime Won't with Data Guard

    make-fetch-happen:使获取发生在npm

    使获取发生 是一个Node.js库,它包装了以及不想包含的其他功能,包括HTTP缓存支持,请求池,代理,重试! 安装 $ npm install --save make-fetch-happen 目录 fetch.defaults minipass-fetch选项 make-fetch-...

    volatile与happens-before的关系与内存一致性错误

    本文讲了Java并发编程中volatile变量、happens-before与内存一致性错误,下面来和小编一起学习下如何解决

    leetcode数组下标大于间距-happen-code:进入Leetcode~

    happen-code Get into Leetcode~ Code List 动态规划 动态规划(英语:Dynamic programming,简称 DP)是一种在数学、管理科学、计算机科学、经济学和生物信息学中使用的,通过把原问题分解为相对简单的子问题的方式...

    Project Make It Happen-crx插件

    Project Make It Happen Extension是一个活动日历,可以帮助我们的团队随时了解最新事件,推送通知和每日激励中心。 通过单击第一个选项卡上包含的链接登录到您的后台。 单击第一个选项卡上的日历将跳至第二个选项卡...

    ERP Make it Happen

    ERP Make it Happen ERP Make it Happen ERP Make it Happen ERP Make it Happen

    make-it-happen-jsonforms:使其成为JSON表单的示例

    让它发生的例子 使其成为示例 入门 首先,您可以简单地克隆此存储库并安装所有必需的依赖项。 先决条件 您需要git来克隆MiHexample存储库。 您可以从获得git。 我们还使用了许多node.js工具来初始化和测试...

    make-fetch-happen:加入失败者,我们正在提出要求!

    使获取发生 是一个Node.js库,该库将打包具有不打算包括的其他功能,包括HTTP缓存支持,请求池,代理,重试!安装$ npm install --save make-fetch-happen 目录例子const fetch = require ( 'make-fetch-happen' ) ....

    John Wiley & Sons - ERP - Making It Happen

    有关ERP和SAP的使用中的经典案例,语言简单易懂,非常利于ERP和SAP的学习。

    MS-DOS 5.0

    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 ...

    Audio Visualizer v2.4.txt

    - Detect beats before they happen. - Create games like Rockband or AudioSurf. - Completely Customizable. - Easy to use. - Mobile Friendly - Well documented. - Tutorials provided. - 17 ...

    NGUI Next-Gen UI v3.7.8.unitypackage

    - 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...

    Making_Things_Happen

    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 高并发三:Java内存模型和线程安全详解

    本文主要介绍Java高并发内存模型和线程安全的资料,这里整理详细的资料及1.原子性 2.有序性 3.可见性 4.Happen-Before 5.线程安全的概念,有需要的小伙伴可以参考下

    项目实现它「Project Make It Happen」-crx插件

    Project Make It Happen Extension是一个活动日历,可以帮助我们的团队随时了解最新事件,推送通知和每日激励中心。 通过单击第一个选项卡上包含的链接登录到您的后台。 单击第一个选项卡上的日历将跳至第二个选项卡...

    java反编译泄露源码-interview-:阿里、腾讯、百度、华为、京东、搜狗和滴滴最新面试题汇集

    java反编译 泄露源码 阿里、腾讯、百度、华为、京东、搜狗和滴滴最新面试题汇集 最后更新于20180513 ...2、简述happen-before规则; 3、JUC和Object;Monitor机制区别是什么;简述AQS原理; 4、简述

Global site tag (gtag.js) - Google Analytics