JMM中的happens-before

JMM中的happens-before概念

设计的初衷

  • 程序员写代码时,是要求内存模型易于理解和易于编程,并且我们也希望程序能按照我们编写的代码一样,能按规则编写顺序执行。(强内存模型,即强规则的内存模型)
  • 对于编译器和处理器的实现来说,它们希望约束尽量少一些,所以编译器和处理器会对指令进行重排,让他们尽己所能的优化来提供性能。(弱内存模型)

程序员希望JMM提供给我们一个强内存模型,而底层的编译器和处理器需要一个弱内存模型来提高自己的性能。

所以JMM向我们程序员提供了足够强的内存可见性保证,只要不改变程序的执行结果,编译器和处理器想怎么优化就怎么优化,所以JMM在一些地方对编译器和处理器进行了约束,以确保可见性。

happens-before

在JMM中,如果一个操作执行的结果需要对另一个操作可见,那么这两个操作之间必须存在happens-before关系。

happens-before使用的地方

happens-before的出现地方:

  • 程序次序规则:一个线程内,按照代码顺序,书写在前面的操作先行发生于书写在后面的操作;
  • 锁定规则:一个unLock操作先行发生于后面对同一个锁额lock操作;
  • volatile变量规则:对一个变量的写操作先行发生于后面对这个变量的读操作;
  • 传递规则:如果操作A先行发生于操作B,而操作B又先行发生于操作C,则可以得出操作A先行发生于操作C;
  • 线程启动规则:Thread对象的start()方法先行发生于此线程的每个一个动作;
  • 线程中断规则:对线程interrupt()方法的调用先行发生于被中断线程的代码检测到中断事件的发生;
  • 线程终结规则:线程中所有的操作都先行发生于线程的终止检测,我们可以通过Thread.join()方法结束、Thread.isAlive()的返回值手段检测到线程已经终止执行;
  • 对象终结规则:一个对象的初始化完成先行发生于他的finalize()方法的开始;
posted @   鸭梨的药丸哥  阅读(17)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示