HappenBefore:编写的代码顺序与执行代码的顺序可能不一致,是因为cpu为了提高运行速度会尝试重排指令。
如果两个操作访问同一个变量,并且有一个操作为写,那么这两个操作就操作数据依赖。存在数据依赖的操作的执行顺序改变会影响结果,所以cpu不会改变存在数据依赖的操作执行的顺序。
例如:
public class HappenBefore {
private static int num = 0;
private static boolean flag = false;
public static void main(String[] args){
for (int i = 0; i < 10; i++) {
num = 0;
flag = false;
//线程1 修改数据
Thread t1 = new Thread(()->{
num = 1;
flag = true;
});
//线程2 读取数据
Thread t2 = new Thread(()->{
if (flag){
num *= 1;
}
//可能会有指令重排
if (num == 0){
System.out.println("此时值为:" + num);
}
});
t1.start();
t2.start();
try {
t1.join();
t2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
运行结果:
此时值为:1
此时值为:0
此时值为:0
线程1对数据进行了修改 ,按理说线程2的 if (num == 0)是不会执行的,但是运行结果还是可能会。