重排序:
- 编译器优化的重排序。
- 指令级并行的重排序。
- 内存系统的重排序。
对于编译器,JMM的编译器重排序会禁止特定类型的编译器重排序,对于处理器重排序,JMM的处理器会要求java编译器在生成指令序列的时候,插入特定类型的内存屏障指令。
单线程的程序遵循as-if-serial语义,不管怎么重排序,单线程程序的执行结果不会改变。编译器和处理器不会对存在数据依赖关系的操作做重排序。
可能发生的顺序为
as-if-serial语义把单线程程序保护起来,使得单线程程序员无需重排序会干扰他们,也无需担心内存可见性问题。
JMM保证程序在正确同步时,程序执行结果和顺序一致性模型中执行结果相同。
JMM并不保证程序执行结果与顺序一致性模型执行结果相同。