微信号:java_bj

介绍:从算法基础到常用框架的知识体系,从初级程序员到高级架构师的成长之路,从创业小团队到Google、BAT的工作机会,始于JAVA而又不止于JAVA.JAVAer在北京,我们一起成长.

JMM 之 happen-before 规则

2016-10-21 00:13 Vampire_x

点击上方“Java北京”关注我们


什么是 happen-before

happen-before 是 Java 内存模型(JMM)规定的两项操作之间的关系。

如果操作A happen-before B,那么操作A(执行的结果) 对操作 B 就是可见的(与时间上的执行顺序是无关的)。

常用的 heppen-before 规则

程序顺序规则:单独一个线程中的每个操作,heppen-before 于该线程中后续的任意操作;

监视器锁规则:对一个锁的解锁操作,heppen-before 于随后对这个锁的加锁操作;

volatile 变量规则:对于一个 volatile 域的写,heppen-before 于任意后续对这个 volatile 域的读;

传递性:如果 A heppen-before B 且 B heppen-before C,那么 B heppen-before C;

线程启动规则:线程对象的 start() 方法 heppen-before 于该线程内的任意操作;

线程中断规则:线程的 interrupt() 方法 happen-before 于被中断线程的代码检测到中断事件的发生;

对象终结规则:一个对象的初始化完成 happen-before 于 finalize() 方法的开始。

happen-before 规则的作用

编译器和处理器希望内存模型对它们的束缚越来越少,从而尽可能的优化程序提高性能。

JMM 满足了编译器和处理器的要求,同时为程序员提供了足够强的内存可见性保证。

happen-before 规则就是 JMM 的核心,它只是一套规则,是给程序员看的,让程序员易于理解 JMM。

 happen-before 关系本质上和 as-if-serial 语义是一回事。

as-if-serial 语义

happen-before 规则

保证单线程内程序的执行结果不被改变

保证正确同步的多线程程序的执行结果不被改变

共同的目的:不改变程序结果的前提下,尽可能提高程序执行的并行度。


是时候关注一个只分享干货的公众号了

长按二维码 关注我们

JAVA北京(java_bj)


 
Java北京 更多文章 蚂蚁金服技术专家总结:性能优化的常见招式 相关搜索 --- 搜索中的推荐 安全与性能可以兼得:优化SSL/TLS保障网站安全 Java异常处理的10个最佳实践 京东:构建需求响应式亿级商品详情页
猜您喜欢 干货:你与年薪百万程序员之间只差这4个习惯! 北京源创会高清图文花絮版 —— 我们只看妹子!【高清大图,请慎重点击】 黑科技,Python 脚本帮你找出微信上删除你好友的人 从技术上升到业务 混合云容灾提上日程 聊聊代码规范