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

 

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

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

 

转载于:https://www.cnblogs.com/xingyunblog/p/10598640.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值