题目描述
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();
所以
因为还没等线程跑起来就输出了
同第一种情况
addThread跑完了,decThread还没跑就输出了
相当于先addThread跑完,再decThread跑完,无并发,所以结果正确
Counter.a 线程不安全,两个线程同时操作结果不确定