重排序对多线程的影响

2019-03-24  本文已影响0人  怖呆

什么是重排序

在Java 中,重排序是指的是Java 虚拟机对未同步的代码执行顺序进行更改。
其他的编程语言也有类似的特性,主要是因为编译器对代码进行优化而导致的。

例如以下代码:

private static int foo;
private static boolean;

public static void main(String[] args){
    foo = 10;
    flag = true;
}

fooflag 没有直接的关系,JVM 很有可能将两行代码进行重新排序。

在单线程的情况下,这样的代码似乎没有什么问题。不过再看看多线程下,这样的代码会导致什么结果。

private static int foo;
private static boolean flag;

public static void main(String[] args){
        new Thread(){
            public void run(){
                while(!flag)
                    Thread.yield();
                System.out.println(foo);
            }
        }.start();
        foo = 10;
        flag = true;
}

这样的代码,就会导致结果不可知。因为JVM 有可能会把 foo = 10flag = true 的顺序重新排序。
可能代码执行很多次都没有问题,但是一旦JVM 对代码进行重排序,将导致严重的后果。
而避免的方法就是对共享的数据进行同步。

上一篇下一篇

猜你喜欢

热点阅读