关于Java中线程Join的思考

题目描述

join()我理解的是线程插队强制执行,如果并发情况下我使用join,跑了下demo,修改线程join,start顺序,有很多种结果,不是很完全清楚,希望有大佬帮忙理理。(环境是windows,6核12线程)

相关代码

粘贴代码文本(请勿用截图)

public class SynThread {
    public static void main(String[] args) throws InterruptedException {
        Thread addThread = new Thread(new Add());
        Thread decThread = new Thread(new Dec());
        addThread.join();
        decThread.join();
        addThread.start();
        decThread.start();
        System.out.println(Counter.a);
    }
}

class Counter {
    static int a = 0;
}

class Add implements Runnable {

    @Override
    public void run() {
        for (int i = 0; i < 1000; i++) {
            Counter.a++;
        }
    }
}

class Dec implements Runnable {

    @Override
    public void run() {
        Counter.a--;
    }
}

//第一种情况,先执行join,再让线程就绪,结果每次是0
addThread.join();
decThread.join();
addThread.start();
decThread.start();

//第二种情况,,结果每次是0
addThread.join();
addThread.start();
decThread.join();
decThread.start();

//第三种情况,结果每次是1000
addThread.start();
addThread.join();
decThread.join();
decThread.start();

//第四种情况,结果每次是999
 addThread.start();
addThread.join();
decThread.start();
decThread.join();

//第五种情况,结果随机,不过大部分是1000 、999  ,每次都在900以上
addThread.start();
decThread.start();
addThread.join();
decThread.join();
阅读 1.5k
1 个回答
  1. 没start就join,相当于啥都没干
  2. 刚start就输出,线程可能还没跑完,甚至可能还没开始跑
  3. 直接对 a 做 ++ 和 --,线程不安全

所以

//第一种情况,先执行join,再让线程就绪,结果每次是0
addThread.join();
decThread.join();
addThread.start();
decThread.start();

因为还没等线程跑起来就输出了

//第二种情况,结果每次是0
addThread.join();
addThread.start();
decThread.join();
decThread.start();

同第一种情况

//第三种情况,结果每次是1000
addThread.start();
addThread.join();
decThread.join();
decThread.start();

addThread跑完了,decThread还没跑就输出了

//第四种情况,结果每次是999
 addThread.start();
addThread.join();
decThread.start();
decThread.join();

相当于先addThread跑完,再decThread跑完,无并发,所以结果正确

//第五种情况,结果随机,不过大部分是1000 、999  ,每次都在900以上
addThread.start();
decThread.start();
addThread.join();
decThread.join();

Counter.a 线程不安全,两个线程同时操作结果不确定

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题