聊聊指令重排

廉价感情. 提交于 2020-02-27 23:39:23

重现指令重排

指令重排是虚拟机的操作,一般容易出现的地方是在多线程模式,单线程不会有问题。 出现指令重排一般是前后两个操作互为独立。比如a=1,b=2 单看这两条指令,就有可能出现重排。

private static int a =0;  
private static boolean flag = false;  
private static int s = 5;  
  
public static void main(String\[\] args) throws InterruptedException {  
  
  
    int j = 0;  
    for(;;){  
        Thread t2 = new Thread(new T2());  
        Thread t1 = new Thread(new T1());  
        Thread t3 = new Thread(new T2());  
        t2.start();;  
        t1.start();;  
        t3.start();;  
        t2.join();  
        t1.join();  
        a=0;  
        flag = false;  
        j++;  
        if(s == 0){  
            break;  
        }  
    }  
    System.out.println(j);  
    System.out.println(s);  
  
}  
  
public static class T1 implements Runnable{  
  
    @Override  
  public void run() {  
        a = 1;  
        flag = true;  
    }  
}  
  
public static class T2 implements Runnable{  
  
    @Override  
  public void run() {  
        if(flag){  
           // System.out.println("ok "+a);  
  if(a == 0){  
                s = 0;  
            }  
        }  
    }  
}

程序运行结果:

188849
0

本机测试,18万次后复现场景,当然实际情况应该用不了这么多次,因为出现指令重排的时候,另一个线程要正好CPU切换到指定代码处,条件比较苛刻。
结论:大家在多线程模式下,如果有依赖另一个线程的数据,一定要注意指令重排。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!