Java并发-重排序
3.2重排序
重排序是指编译器有处理器为了优化程序性能而对指令序列进行重排序的一种手段。
3.2.1 数据依赖性
编译器和处理器可能会对操作做重排序。编译器和处理器在重排序时,会遵 守数据依赖性,编译器和处理器不会改变存在数据依赖关系的两个操作的执行顺序。
这里所说的数据依赖性仅针对单个处理器中执行的指令序列和单个线程中执行的操作, 不同处理器之间和不同线程之间的数据依赖性不被编译器和处理器考虑。
3.2.2 as-if-serial语义
as-if-serial语义的意思是:不管怎么重排序(编译器和处理器为了提高并行度),(单线程) 程序的执行结果不能被改变。编译器、runtime和处理器都必须遵守as-if-serial语义。
3.2.3 程序顺序规则
在计算机中,软件技术和硬件技术有一个共同的目标:在不改变程序执行结果的前提下, 尽可能提高并行度。编译器和处理器遵从这一目标,从happens-before的定义我们可以看出, JMM同样遵从这一目标。
3.2.4重排序对多线程的影响
class ReorderExample {
int a = 0;
boolean flag = false;
public void writer() { //线程1
a = 1;
flag = true; // 因为a和flag之间没有依赖关系,可能会重排序
}
public void reader() { //线程2
if (flag) { // flag为true了, a不一定为1,
int i = a * a;
......
}
}
}