美文网首页
指令重排演示

指令重排演示

作者: 大黑跟小白的日常 | 来源:发表于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值的内存可见性,可能存在误导,还望大佬指教

相关文章

  • 指令重排演示

    什么是指令重排? 最终解析成cpu可以可以执行的指令,cpu去执行时,x=1不一定会先执行,因为不存在先后的逻辑关...

  • 指令重排(Happens-Before法则)

    1.什么是指令重排 程序指令的执行顺序有可能和代码的顺序不一致,这个过程就称之为指令重排。 2.指令重排的作用 J...

  • Java笔记1--volatile&CAS&集合

    volatile保证有序性(禁止指令重排) volatile总结 volatile实现禁止指令重排优化,从而避免多...

  • Java 并发模型

    在之前的文章中,我们了解到了计算机为什么会出现指令重排、指令重排引起的问题、为了解决指令重排而引入的缓存一致性和内...

  • 指令重排

    指令重排 指令重排序是JVM为了优化指令,提高程序运行效率,在不影响单线程程序执行结果的前提下,尽可能地提高并行度...

  • 指令重排

    jvm做的一种优化策略,为了提高cpu的利用率,更改了指令执行顺序。 单线程下:jvm保证的指令执行的基本有序性,...

  • 指令重排

  • Java多线程实现基础(二)

    Java内存模型 基本概念 指令重排 jvm 指令执行

  • 指令重排序和内存屏障

    一:指令重排序 指令乱序有两种情况,一种是编译器做的优化,另外一种就是cpu流水线操作指令的延迟性。指令重排序是指...

  • 我理解的volatile

    volatile语义 volatile有两层语义:可见性和禁止指令重排序。什么是可见性和指令重排序,在这里就不解释...

网友评论

      本文标题:指令重排演示

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