美文网首页
重排序对多线程的影响

重排序对多线程的影响

作者: 怖呆 | 来源:发表于2019-03-24 16:02 被阅读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 对代码进行重排序,将导致严重的后果。
    而避免的方法就是对共享的数据进行同步。

    相关文章

      网友评论

          本文标题:重排序对多线程的影响

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