happens-before是何方神圣

一、概述
1.Java内存模型(Java Memory Model或JMM)里定义的happens-before 规则指的是:用于描述多线程中变量读写等不同操作之间的内存可见性,若操作 A happens-before  操作 B ,那么操作 A  的结果对操作 B  可见。

2.happens-before 规则分为单线程和多线程的情况:
1)单线程下的 happens-before :
因为单线程内只有一份工作内存,不存在数据一致性的问题,所以字节码的先后执行顺序天然符合happens-before关系。 
在程序中靠前的字节码 happens-before 靠后的字节码,即靠前
的字节码执行完之后的操作结果对靠后的字节码可见。但是,这并不意味着前者一定在后者之前执行。若后者不依赖前者的运行结果,那么它们可能会被重排序。
2)多线程下的 happens-before:
多线程中由于每个线程都有共享变量的工作内存副本,如果没有对共享变量做同步处理,线程1更新A共享变量的值之后,线程 2 开始执行操作 B,此时操作 B 不一定能看见变量 A 被更新后的值。

二、详细
Java 内存模型实现了下述支持 happens-before 关系的操作:
1.  程序顺序规则: 一个线程内,按照代码顺序,书写在前面的操作 happens-before 书写在后面的操作。

2.  锁规则: 对一个锁的 unlock 操作 happens-before 后面对同一个锁的 lock 操作。

3.  volatile 变量规则: 对一个volatile变量的写操作 happens-before 后面对这个变量的读操作。volatile关键字保证变量在不同线程之间的可见性。

4.  传递规则: 若操作 A happens-before 操作 B,而操作 B 又 happens-before 操作 C,则操作 A happens-before 操作 C。

5.  线程启动规则:Thread 对象的 start()方法 happens-before 此线程内的任何代码的执行。

6.  线程中断规则: 对线程 interrupt()方法的调用 happens-before 被中断线程的代码检测到中断事件的发生(通过静态方法Thread.interrupted()或实例方法Thread.isInterrupted()调用)。

7.  线程终结规则: 线程中所有的操作都 happens-before 线程的终止检测,我们可以通过 Thread.join()方法等待线程结束、Thread.isAlive()的返回值为false等手段检测到线程是否已经终止执行。

8.  对象终结规则: 一个对象的构造方法执行完毕 happens-before 它的 finalize()方法的开始执行。


微风不燥,阳光正好,你就像风一样经过这里,愿你停留的片刻温暖舒心。

我是程序员小迷(致力于C、C++、Java、Kotlin、Android、Shell、JavaScript、TypeScript、Python等编程技术的技巧经验分享),若作品对您有帮助,请关注、分享、点赞、收藏、在看、喜欢,您的支持是我们为您提供帮助的最大动力。

欢迎关注。助您在编程路上越走越好!

  • 14
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值