指令重排(Happens-Before法则)

1.什么是指令重排

程序指令的执行顺序有可能和代码的顺序不一致,这个过程就称之为指令重排。

2.指令重排的作用

JVM能根据处理器的特性,充分利用多级缓存,多核等进行适当的指令重排序,使程序在保证业务运行的同时,充分利用CPU的资源,发挥最大的性能!

由于指令重排的特性,为了保证程序在多线程的条件下运行结果能够与单一线程下一致,引入了Happens-Before规则。也就是说,Happens-Before规则主要是用来确保并发情况下数据的正确性。

3.Happens-Before的含义

如果动作B要看到动作A的执行结果,无论A/B是否在同一个线程中,那么A/B必须满足happens-before规则。

4. happens-before规则

1)如果ActionA和ActionB属于同一个线程,那么就说明ActionA happens-before ActionB。
2)如果ActionA是unlock操作,而ActionB是lock操作,那么ActionA happens-before ActionB。
3)如果A是对volatile变量的写操作,ActionB是对同一个变量的读操作,那么ActionA happens-before ActionB。
4)线程的启动Action happens-before 该线程上的其他动作。
5)线程中任何Action都 happens-before 任何其他线程检测到该线程已经结束、Thread.join调用成功返回,Thread.isAlive返回false。
6)一个线程调用另一个线程的interrupt一定发生在另一个线程中断之前。
7)一个对象的构造函数结束一定发生在兑现finalizer之前。
8)ActionA发生在ActionB之前,ActionB发生在ActionC之前,则ActionA一定发生在ActionC之前。
ActionA happends-before ActionB,记作hb(ActionA,ActionB)。

5. JMMA(Java Memory Model Action)

Java模型动作,一个Action包含,变量读取、变量写、监视器枷锁、释放锁、线程启动(start)、线程等待(join)。

6. happens-before应用的例子

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 接指令重排序对主存的一次访问一般花费硬件的数百次时钟周期。处理器通过缓存(caching)能够从数量级上降低内存延...
    值得一看的喵阅读 3,746评论 0 0
  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 14,687评论 1 92
  • 1. tab列表折叠效果 html: 能源系统事业部 岗位名称: 工作地点 岗位名...
    lilyping阅读 5,889评论 0 1
  • 虚度光阴空染指,错失缘念乱成吟。 一心孤对刁残月,两盏难邀共已人。 混迹俗群迷道路,偷来文酒醉诗心。 简书方作文诗...
    房谋杜断阅读 4,808评论 15 17
  • 01 写这篇文章,也许会遭到许多人的批判,但是我并不担心会受到生命威胁,因为我知道,一篇文章的力量微乎其微,大量的...
    陈禄阅读 4,540评论 6 5