• 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

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

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

  • 相关阅读:
    Java 将Clob字段转换成String字符串
    Java BigDecimal详解
    java循环创建对象应该在循环体内还是循环体外
    Java 通过身份证获取生日和性别
    Java将数据进行分组处理
    Java 2进制和16进制的转换
    Map-HashMap 与 IF 判断内存占用对比
    Groovy脚本-通用SQL开关
    Oracle用户、授权、角色管理
    【docker随笔系列】安装sqlserver
  • 原文地址:https://www.cnblogs.com/xingyunblog/p/10598640.html
Copyright © 2020-2023  润新知