Java如何证明CPU乱序执行?

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
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容