1 数据依赖性
写后读、写后写、读后写。
编译器和处理不会改变存在数据依赖关系的两个操作执行顺序。
2 as-if-serial
不管怎么重排序( 编译器和处理器为了提高并行度), (单线程)程序的执行结果不能被改变。编译器, runtime 和处理器都必须遵守 和处理器都必须遵守 as -if -serial 语义。
如果操作之间不存在数据依赖关系,这些操作就可能被编译器和处理器重排序。
3 程序顺序规则
如果 A happens- before B ,JMM并不要求 A一定要在 B之前执行。 JMM 仅要求前一 个操作(执行的结果)对后一个操作 可见,且前一个操作按顺序排在第二个操作之前。这里A的执行结果不需要对操作 B可见; 而且重排序操作 A和操作 B后的执行结果, 与操作 A和操作B按 happens- before顺序执行的结果一致 。在这种情况下, JMM会认为这种重排序并不非法( not illegal)。
本质上是:(这是整个JMM的核心使命)
软件技术和硬有一个共同的目标:在不改变程序执行结果的前提下,尽可能的开发并行度。编译器和处理器遵从这一目标, 从happens- before 的定义我们可以看出, JMM同样遵从这一目标。
4 重排序对多线程的影响
在单线程中,对没有数据依赖进行重排序不会改变执行结果,但是多线程下可能会改变。

在单线程中,对存在控制依赖的操作重排序,不会改变执行结果,但是多线程下可能会改变。
