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

重排序对多线程的影响

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

相关文章

  • 重排序对多线程的影响

    什么是重排序 在Java 中,重排序是指的是Java 虚拟机对未同步的代码执行顺序进行更改。其他的编程语言也有类似...

  • java并发编程(七)

    java多线程编程(七) 这一节,看一下重排序对多线程的影响。 示例代码: flag 变量是个标记,用来标记变量a...

  • shell-sort命令

    通过sort对输出进行排序。 语法 实例 对排序结果进行去重

  • 第一章:为什么要关心Java8

    给苹果按照重量排序 Java8的写法 Java8对硬件的影响 Java8之前程序都是单线程的,如果想使用多线程那么...

  • linux uniq 命令整理

    uniq 对排序好的内容进行去重 语法: 选项: 这里也不多说,就说一句,uniq 是对排序好的内容去重,一般和 ...

  • go实现快速排序

    第一,单线程实现快速排序 第二,多线程实现快速排序

  • 家庭排序对孩子的影响

    孩子对于父母的价值观一般都是接受,要不就是拒绝,很少处于中立的状态,因此,孩子的对于家庭价值观的判定就变成了...

  • order by 和 索引

    1、 order by 排序字段和索引 2、 order by 排序字段对其他字段索引的影响 3、 mysql是怎...

  • 再学JS--数组去重

    双层循环 最原始的数组去重方式 indexOf 排序后去重 排序去去重是将数组进行sort排序,相同的值就会被排在...

  • 多线程归并排序改进版

    利用多线程归并有序集改进了下多线程排序,只剩下多线程拷贝没实现了。。。 代码 benchmark代码 测试结果

网友评论

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

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