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