CPU对于两条不相干的指令有可能是乱序执行的。
比如如下代码:
int a = 1;
int b = 2;
两个语句没有任何关联的关系,有可能 int b = 2先执行。那么如何证明呢?
我们用如下代码证明CPU会乱序执行:
package com.vertxjava.jvm;
/**
* 证明CPU乱序执行
*/
public class 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(() -> {
a = 1;
x = b;
});
Thread other = new Thread(() -> {
b = 1;
y = a;
});
one.start();
other.start();
one.join();
other.join();
String result = "第" + i + "次 (" + x + "," + y + ")";
// 出现00组合 证明cpu乱序执行了
if (x == 0 && y == 0) {
System.err.println(result);
break;
} else {
//System.out.println(result);
}
}
}
}
我们假设不会出现乱序执行,那么x和y可能出现3种组合:
x = 1;
y = 1;
x = 0;
y = 1;
x = 1;
y = 0;
如果出现x=0并且y=0,那说明x=b一定先于a=1执行了,并且y=a一定先于b=1执行了。
输出结果:
第183783次 (0,0)
Process finished with exit code 0