执行代码的顺序可能与编写代码不一致,即虚拟机优化代码顺序,则指令重排
package com.lzy.others;
/**
* 指令重排:代码执行顺序与预期不一致
* 目的:提高性能
* @author Administration
*
*/
public class TestHappenBefore {
private static int a=0;
private static boolean flag=false;
public static void main(String[] args) throws InterruptedException {
for(int i=0;i<10;i++) {
a=0;
flag=false;
Thread t1=new Thread(()-> {
a=1;
flag=true;
});
Thread t2= new Thread(()-> {
if(flag) {
a*=1;
}
if(a==0) {
System.out.println("HappenBefore-->"+a);
}
});
t1.start();
t2.start();
t1.join();
t2.join();
}
}
}
运行结果:
HappenBefore–>1
HappenBefore–>0
运行结果中如果要出现
if(a==0) {
System.out.println("HappenBefore-->"+a);
}
该段代码的打印,a显然只有等于0时才会出现,但在这里a=1时也打印了一次,这就是出现了HappenBefore的现象
以下是我自己的理解:
假如有该段代码:
1.int a=2;
2.int b=3;
3.System.out.println(a/b/b/b/a/a%b+a+b+a+b+b);
4.System.out.println(“3”);
在代码运行时,运行到第三行时需要很久时间,CPU可能就不愿等,然后发现第四行代码和第三行代码无关,于是就先运行第四行了,后运行第三行