读书笔记《JAVA并发编程的艺术》 第三章 Java内存模型 3.7 happens-before

3.7 happens-before

3.7.1 JMM的设计

设计意图

  1. 程序员对内存模型的使用
  2. 编译器和处理器对内存模型的实现

由于这两个因素相互矛盾,JSR-133专家组在设计JMM时的核心目标就是找到一个好的平衡点:一方面,要为程序员提供足够强的内存可见性保证;另一方面,对编译器和处理器的限制要尽可能地放松。

这里写图片描述

3.7.2 happens-before的定义

《JSR-133:Java Memory MOdel and Thread Specification》对happens-before关系的定义如下:

  1. 如果一个操作happens-before另一个操作,那么第一个操作的执行结果对于第二个操作来说是可见的,而且第一个操作的执行顺序排在第二个操作之前。(JMM对程序员的承诺)
  2. 两个操作之间存在happens-before关系,并不意味着Java平台的具体实现必须要按照happens-before关系指定的顺序来执行。(JMM对编译器和处理器重排序的约束原则)

as-if-serial语义和happens-before关系在本质上是一回事。都是为了在不改变程序执行结果的前提下,尽可能地提高程序执行的并行度。

3.7.3 happens-before规则

《JSR-133:Java Memory MOdel and Thread Specification》定义了如下happens-before规则:

  1. 程序顺序规则:一个线程中的每一个操作,happens-before于该线程中的任意后续操作
  2. 监视器锁规则:解锁happens-before加锁
  3. volatile变量规则:读volatile域happens-before于对该volatile域的写
  4. 传递性:如果Ahappens-beforeB,Bhappens-beforeC,则Ahappens-beforeC
  5. start()规则:如果线程A执行操作ThreadB.start(),那么A线程的ThreadB.start()操作happens-before于线程B中的任意操作。
  6. join()规则:如果线程A执行操作ThreadB.join()并成功返回,那么线程B中的任意操作happens-before于线程A从ThreadB.join()操作成功返回。

猜你喜欢

转载自blog.csdn.net/maohoo/article/details/81280693