深入理解Java内存模型 ch2 重排序

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 重排序对多线程的影响

在单线程中,对没有数据依赖进行重排序不会改变执行结果,但是多线程下可能会改变。


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


©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容