`
cfyme
  • 浏览: 273517 次
  • 性别: 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

    7. **传递性**:如果 A `happen-before` B,B `happen-before` C,那么 A `happen-before` C。 理解 `happen-before` 规则对于编写高效的并发代码至关重要。例如,使用 `volatile` 变量可以确保多线程环境中的数据...

    深入浅出了解happens-before原则

    "深入浅出了解happens-before原则" 在 Java 内存模型(JMM)中,happens-before 原则是一个核心概念,它规定了多线程环境下的可见性原则。该原则的核心思想是:两个操作之间的 happens-before 关系,并不意味着前一...

    Crashes Happen - Downtime Won't with Data Guard

    "Crashes Happen - Downtime Won't with Data Guard"这个主题强调了即使在系统崩溃的情况下,通过Data Guard也能避免停机时间,确保业务连续性。 Data Guard的核心是通过创建一个或多个备用数据库(standby ...

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

    在Java并发编程中,理解和掌握volatile关键字以及happens-before原则对于解决内存一致性错误至关重要。内存一致性错误通常出现在多线程环境下,当不同线程访问共享变量时,由于缓存和处理器优化,可能导致数据不一致...

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

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

    JSR133中文版,JSR133中文版

    Happen-Before内存模型是JSR-133中定义的一种内存模型,它描述了操作之间的顺序关系。这种内存模型可以用来确保在多线程环境下,操作的执行顺序是正确的。 JSR-133是Java语言中非常重要的规范,它定义了Java语言的...

    volatile可见性的一些认识和论证

    happen-before是一个可见性原则,定义了Java语言中操作的执行顺序。它有五个规则:程序次序规则、锁定规则、volatile变量规则、传递规则和线程启动规则。happen-before规则保证了在多线程环境下,操作的执行顺序和...

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

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

    Java 高并发三:Java内存模型和线程安全详解

    Happen-Before原则是JMM中的一个关键概念,它定义了在多线程环境下,一个操作对另一个操作的可见性。如果A操作Happen-Before B操作,那么B能看到A的结果。例如,线程的启动操作Happen-Before该线程的任何读写操作,`...

    JVM面试题分享给需要的同学.zip

    6JVM内存模型的相关知识了解多少,比如重排序,内存屏障,happen-before,主内存,工作内存 7.简单说说你了解的类加载器,可以打破双亲委派么,怎么打破 8.说说你知道的几种主要的JVM参数 9.怎么打出线程栈信息 10....

    ERP Make it Happen

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

    Project Make It Happen-crx插件

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

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

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

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

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

    并发编程基础知识,java内存模型及多线程、volatile

    Happen-Before规则是一组用于保证线程之间执行顺序的规则,主要包括: - 程序顺序原则:在一个线程内部保证语义的串行性。 - volatile规则:volatile变量的写操作先于任何读操作。 - 锁规则:解锁操作必然发生在...

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

Global site tag (gtag.js) - Google Analytics