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

 

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

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

 

posted @ 2019-03-26 10:33  技术宅星云  阅读(2008)  评论(0编辑  收藏  举报