重排序是指 编译 器和 处 理器 为 了 优 化程序性能而 对 指令序列 进 行重新排序的一种手段。
1.数据依赖性
如果两个操作 访问 同一个 变 量,且 这 两个操作中有一个 为 写操作,此 时这 两个操作之 间就存在数据
依赖性。
数据依赖的类型
上面 3 种情况,只要重排序两个操作的 执 行 顺 序,程序的 执 行 结 果就会被改 变
编译 器和 处 理器在重排序 时 ,会遵 守数据依赖 性, 编译 器和 处 理器不会改 变 存在数据依 赖 关系的
两个操作的 执 行 顺 序。
数据依 赖 性 仅针对单 个处理器中执行的指令序列和单个线程中执 行的操作, 不同处 理器之 间和不同线程之 间 的数据依 赖 性不被 编译 器和 处 理器考 虑 。
2.as-if-serial语义
as-if-serial语义 的意思是:不管怎么重排序( 编译 器和 处 理器 为 了提高并行度),( 单线 程)
程序的 执 行 结 果不能被改 变 。 编译 器、 runtime 和 处 理器都必 须 遵守 as-if-serial 语义 。
在 计 算机中, 软 件技 术 和硬件技 术 有一个共同的目 标 :在不改 变 程序 执 行 结 果的前提下, 尽可能提高并行度。在不影响程序执行结果,保证数据依赖性的情况下,有些重排序是可以允许的。JMM会认为这种重排序并不非法(not illegal),JMM允许这种重排序。
3.重排序对多线程程序的影响
在 单线 程程序中, 对 存在控制依 赖 的操作重排序,不会改 变执 行 结 果( 这 也是 as-if-serial语义允 许
对 存在控制依 赖 的操作做重排序的原因);
但在多 线 程程序中, 对 存在控制依 赖 的操作重排序,可能会改变程序的执 行 结 果。
