重排序:指编译器和处理器为了优化程序性能对指令进行重排序的一种手段。Java内存模型中,允许编译器和处理器对指令进行重排序,但是重排序可以保证最终执行的结果与程序顺序执行的结果一致。并且只会对不存在数据一致性的指令进行重排序。
int a = 1; // 1
int b = 2; // 2
int c = a + b; // 3
class Demo{
int a = 0;
boolean flag = false;
public void write(){
a = 1; //1
flag = true; //2
}
public void read(){
if(!flag){
a = 2;
}
}
}
数据依赖性:如果两个操作访问同一个变量,且这两个操作有一个是写操作,此时这两个操作之间就存在数据依赖性。
1.写---读
a = 1;
b = a;
2.写---写
a = 1;
a = 2;
3.读--写
a = b;
b = 1;
编译器和处理器在重排序时,会遵循数据依赖性,编译器和处理器不会改变存在依赖关系的两个操作的执行顺序。