本文最后更新于:2020年9月16日 上午

Java并发系列(十三)-happens-before

首先我们需要认识到happens-before是JMM最核心的概念。

本篇主要从以下几个方面展开:

  • 1、JMM的设计
  • 2、happens-before要求禁止的重排序
  • 3、JMM设计示意图
  • 4、happens-before的定义
  • 5、as-if-serial语义和happens-before关系对比
  • 6、happens-before规则

1、JMM的设计

1.1、JMM设计的两个关键因素

1.程序员对内存模型的使用。

    要求内存模型简单理解、易于编程。(强内存模型)

2.编译器和处理器对内存模型的实现。

    对编译器和处理器的约束越少越好,可以提高性能。(弱内存模型)

1.2、JMM关键因素的平衡点

一方面,要为程序员提供足够强的内存可见性保证;

另一方面,要对编译器和处理器的限制尽可能的放松。

2、happens-before要求禁止的重排序

共两类:

1.会改变程序执行结果的重排序。
2.不会改变程序执行结果的重排序。

2.1、JMM对禁止的重排序采取的策略

- 对于会改变程序执行结果的重排序,JMM要求编译器和处理器必须禁止这种重排序。

- 对于不会改变程序执行结果的重排序,JMM允许这种重排序,但同时也没有说JMM应该怎么做。

3、JMM设计示意图

4、happens-before的定义

JSP-133对happens-before的定义:

1.如果一个操作happens-before另一个操作,那么第一个操作的执行结果将对第二个操作可见,
而且第一个操作的执行顺序排在第二个操作之前。(JMM对程序员的承诺)

2.虽然存在happens-before关系,但只要重排序的执行结果不变,那么JMM也是允许的。(JMM对编译器和处理器重排序的约束原则)

5、as-if-serial语义和happens-before关系对比

1.as-if-serial语义是保证单线程内程序的执行结果不改变,
happens-before关系是保证多线程的执行结果。

2.它们都为程序员提供了幻境。as-if-serial语义的幻境是,单线程程序是按照顺序执行的;
happens-before关系的幻境是,多线程是按照happens-before指定的顺序来执行的。

6、happens-before规则

关于happens-before规则在我之前的博文中有讲到:

Java并发系列(七)-Java内存模型-基础


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!博客中转载文章会注明出处,若有版权问题,请及时与我联系!谢谢!

Java并发系列(十四)-双重检查锁定与延迟初始化 上一篇
Java并发系列(十二)-final域的内存语义 下一篇