一、为什么CPU要乱序执行?
首先我们要明白一点,不是cpu真的乱序执行,而是为了提交执行效率,但这个所谓的乱序执行的前提下是有依据的,在没有互相依赖的代码行里才有可能产生这种乱序执行的现象。
1、有可能产生乱序执行案例,例如:
int A = 1;
int B = 2;
这种情况当cpu执行A 的时候,会先去内存里读取A的值为1的数据,而这个读数据的过程,CPU会判断int B = 2;的代码有没有跟A有依赖关系,如果没有,会先执行B的代码行,等A啥时候读取完数据在告诉CPU读取完了,在执行A。因为CPU效率比内存快100倍起步,不可能等到A读取完数据在执行下一行指令。
2、不可能产生乱序执行案例,例如:
如下代码就不可能产生乱序执行的现象,因为B是依赖A的,先有A在有B
int A = 1;
int B = A;
二、怎么验证CPU是乱序执行的?
代码如下(示例):
public class T04_Disorder {
private static int x = 0, y = 0;
private static int a = 0, b =0;
public static void main(String[] args) throws InterruptedException {
int i = 0;
for(;;) {
i++;
x = 0; y = 0;
a = 0; b = 0;
Thread one = new Thread(new Runnable() {
@Override
public void run() {
//由于线程one先启动,下面这句话让它等一等线程two. 读着可根据自己电脑的实际性能适当调整等待时间.
//shortWait(100000);
a = 1;
x = b;
}
});
Thread other = new Thread(new Runnable() {
@Override
public void run() {
b = 1;
y = a;
}
});
one.start();other.start();
one.join();other.join();
String result = "第" + i + "次 (" + x + "," + y + ")";
if(x == 0 && y == 0) {
System.err.println(result);
break;
} else {
//System.out.println(result);
}
}
}
public static void shortWait(long interval){
long start = System.nanoTime();
long end;
do{
end = System.nanoTime();
}while(start + interval >= end);
}
}
执行结果
"第1569421"次 ( 0 ,0);
最后会出现x=0,y=0的情况
整了