美文网首页
指令重排演示

指令重排演示

作者: 大黑跟小白的日常 | 来源:发表于2019-07-29 10:09 被阅读0次

    什么是指令重排?

            int x = 1;
            int y = 2;
    

    最终解析成cpu可以可以执行的指令,cpu去执行时,x=1不一定会先执行,因为不存在先后的逻辑关系;
    如果 将 int y = 2 改成 y = x+1,那么则存在先后逻辑关系,肯定先执行的x=1;

    如下代码做一个具体演示

    如果不存在指令重排,那么当y = 200时,x要么等于100,要么等于101(执行完 x = i 线程中断)

    那么主内存中x、y值 (同步线程内存值之后) 始终满足(y = 2x || y = 2(x-1))为true

    由于加上volatile虽然可以保证内存可见性但是会限制指令重排,所以没有使用。目前还没有找到完美的测试方案,只能以最后同步打印的数据作为依据

    public class OrderReSort {
        int x = 0, y = 0;
        public void write() {
            for (int i = 1; i <= 2000000; i++) {
                x = i;
                y = i+i;
            }
        }
        public void read() {
            while (true) {
    //            System.out.println(y);
    //            System.out.println(x);
                if (y != 2 * x && y != 2 * (x-1)) // 考虑 x = i执行后线程被调度导致y = i+1没有执行,所以这里加了两个条件
                    break;
            }
            // 同步打印数据,会刷新主内存数据
            System.out.println("出现了: y = "+y+",x = "+x);
        }
    }
    

    写操作

    class Write implements Runnable {
        private OrderReSort orderReSort;
        public Write(OrderReSort orderReSort) {
            this.orderReSort = orderReSort;
        }
        @Override
        public void run() {
            orderReSort.write();
        }
    }
    

    读操作

    class Read implements Runnable {
        private OrderReSort orderReSort;
        public Read(OrderReSort orderReSort) {
            this.orderReSort = orderReSort;
        }
        @Override
        public void run() {
            orderReSort.read();
        }
    }
    

    测试

        public static void main(String[] args) {
            OrderReSort orderReSort = new OrderReSort();
            new Thread(new Write(orderReSort)).start();
            new Thread(new Read(orderReSort)).start();
        }
    

    结果

    image.png

    由此发现,for循环中

                x = i;
                y = i+i;
    

    他们最终在JVM中执行的顺序并不一定,指令重排效果演示成功

    本文由于没有实时的考虑到 x、y值的内存可见性,可能存在误导,还望大佬指教

    相关文章

      网友评论

          本文标题:指令重排演示

          本文链接:https://www.haomeiwen.com/subject/tgrvrctx.html