java 内存模型中的happen-before 是什么?

 2019-12-10 15:59  阅读(1049)
文章分类:Java Core

happen-before 关系,是Java内存模型中保证多线程可见性的机制,也是对早期语言规范中含糊的可见性概念的一个精确定义。

它的具体表现形式,包括但远不止测试我们直觉中的 synchronized、volatile、lock 操作顺序等方面,例如:

  • 线程内存执行的每个操作,都保证happen-before后边的操作,这就保证了基本程序顺序规则,这是开发者再书写程序时的基本约定。
  • 对于volatilte 变量,对它的写操作,保证happen-before在随后对该变量的读取操作。
  • 对于一个锁的解锁操作,保证happen-before加锁操作。
  • 对象构建完成,保证happen-before对于finalizer的开始动作。
  • 甚至是类似线程内部操作的完成,保证happen-before其他Thread.join()的线程等。

这些happen-before关系是存在着传递性的,如果满足a happen-before b 和 b happen-before c,那么a happen-before c 也成立。

前面我一直用happen-before,而不是简单说前后,是因为它不仅仅是对执行时间的保证,也包括对内存读、写顺序的保证。仅仅是时钟顺序上的先后,并不能保证线程交互的可见性。

JMM 内部的实现通常是依赖于所谓的内存屏障,通过禁止某些重排序的方式,提供内存可见性保证,也就是实现各种happen-before规则。happen-before原则是JMM中非常重要的原则,它是判断数据是否存在竞争、线程是否安全的主要依据,保证了多线程环境下的可见性。

下图是happens-before与JMM的关系图(摘自《Java并发编程的艺术》)

20191210001466\_1.png

点赞(0)
版权归原创作者所有,任何形式转载请联系作者; Java 技术驿站 >> java 内存模型中的happen-before 是什么?

相关推荐