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

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

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

  • 相关阅读:
    javaScript设计模式:装饰模式
    搭建自动签到服务
    Gmail邮箱注册
    springcloud3(六) 服务降级限流熔断组件Resilience4j
    PCB
    行业_激光
    Git设置Http代理,克隆github上的代码
    工控机与运动控制卡
    锂电池生产工艺
    PCB涂胶工艺
  • 原文地址:https://www.cnblogs.com/xingyunblog/p/10598640.html
Copyright © 2011-2022 走看看