zoukankan      html  css  js  c++  java
  • Java 多线程重排序的探究

    最近在看《Java 并发编程实战》,之前对所谓的线程的重排序一脸懵逼,今天终于有了点理解。

    我们先来看下这个实例Demo

    /**
     * 线程的重排序问题
     * **/
    public class PossibleReordering {
    
        static int x=0,y=0;
        
        static int a=0,b=0;
        
        public static void main(String[] args) throws InterruptedException {
            Thread oneThread=new Thread(new Runnable() {
                
                @Override
                public void run() {
                    // TODO Auto-generated method stub
                    a=1;// a=0---->1
                    x=b;// x=b=0
                }
            });
            
            Thread twoThread=new Thread(new Runnable() {
                
                @Override
                public void run() {
                    // TODO Auto-generated method stub
                    b=1;//b=1 
                    y=a;//y=a=1
                }
            });
            
            oneThread.start();
            
            twoThread.start();
            
            oneThread.join();
            
            twoThread.join();
            
            /**
             * 如果不指定线程一和线程二的先后顺序,结果会不可知
             * 情况一:
             * 线程一先执行,线程二后执行
             * x=0,y=0
             * 情况二:
             * 线程二先执行, 线程一后执行
             * x=0,y=0
             * 情况三:
             * 线程一和线程二交替执行
             * x=0,y=1
             * 情况四:
             * x=1,y=1
             * 情况五:
             * x=1,y=0
    * 其他情况:
    * ... * *
    */ System.out.println("x="+x+",y="+y); } }

    在上面这个代码中由于没有指定线程一和线程二的先后顺序,因此执行这段代码后,会有一个神奇的现象。

    执行后输出结果可能是

    x=0,y=1

    但是过一小会再次执行就可能变成

    x=1,y=0

    这就是线程重排序的一个现象。

    所谓的线程重排序用通俗易懂的话来说就是,线程一和线程二的执行先后顺序在第一次执行和第二次执行后可能会重新排序。

  • 相关阅读:
    统计元音 题解
    C语言合法标识符 题解
    查找最大元素 题解
    java_day05_数组
    java_day4_while循环
    java_day03_if,Switch,三目和for循环
    java_day02_基本运算符和数据类型
    java_day01_注释,变量
    前端_day04_行,块,RGB,行高,overflow
    前端_day03_盒子模型,border,padding,margin
  • 原文地址:https://www.cnblogs.com/xingyunblog/p/10598640.html
Copyright © 2011-2022 走看看