前言
happens-before是JMM的核心,之所以设计happens-before,主要出于以下两个方面的因素考虑的:1)程序员的角度,JMM内存模型需要易于理解、易于编程;2)编译器和处理器的角度,编译器和处理器希望内存模型对其束缚越少越好,这样就可以根据自己的处理规则进行优化。但是这两个方面其实是相互矛盾的,因为JMM易于编程和理解就意味着对编译器和处理器的束缚就越多。
happens-before定义
基于上面的考虑,设计JMM时采用了一种折中的选择——JMM将需要禁止的重排序分为两类(因为编译器和处理器的优化大部分是重排序,所以JMM的处理的关键也就是重排序了):
- 会改变程序执行结果的重排序
- 不会改变程序执行结果的重排序
对应这两种情况,JMM采用了不同的策略:
- 对于会改变程序执行结果的重排序,JMM要求编译器和处理器必须禁止这种重排序
- 对于不会改变程序执行结果的重排序,JMM对编译器和和处理器不做任何要求(自然,编译器和处理器可以其进行重排序)
所以JMM的设计基于这样一种原则:先保证正确性,在考虑执行效率问题。
说了这么多,与happens-before原则有什么关系呢?从上面可以看到JMM实际上可以看做是操作之间的约束模型,这种约束模型的实现就是我们要提到的happens-before了。happens-before**用来指定两个操作之间的执行顺序**,这两个操作可以在一个线程之内也可以在不同