CPU在进行读等待的同时执行指令,是CPU乱序的根源。不是乱,而是提高效率。
CPU在执行A指令的时候,指令B也在执行,甚至B指令执行完了A指令还在执行。例如:A指令去内存读数据,等待返回期间,B指令可以优先执行。(AB指令不能存在依赖关系,可以提升效率)
public class Disorder {
private static int x=0,y=0;
private static int a=0,b=0;
//无论这两个线程怎么排列组合 如果没有重排序,一定不会存在x=0 且 y=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
//shortWati(100000);
//前后没有依赖关系 a=1和 x=b
a=1;
x=b;
}
});
Thread other = new Thread(new Runnable() {
@Override
public void run() {
//如果不存在乱序,b=1一定在y=a前面
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);
}
}
第1283次(1,0)
第1284次(0,1)
第1285次(1,0)
第1286次(0,1)
第1287次(0,0)
最终出现了乱序执行的情况
|