CPU乱序执行

一、为什么CPU要乱序执行?

首先我们要明白一点,不是cpu真的乱序执行,而是为了提高执行效率,但这个所谓的乱序执行的前提下是有依据的,在没有互相依赖的代码行里才有可能产生这种乱序执行的现象。
1、有可能产生乱序执行案例,例如:

int A = 1int 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 = 1int 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的情况
整了

CPU乱序执行_第1张图片

你可能感兴趣的:(java)