悟空老师,看到 synchronize 的升华部分突然想到的一个问题。
来源:13-6 可见性

qq_弹簧_3
2019-10-07
这个是您之前讲过的一段多线程执行 a++ 操作的相关代码。 输出结果是一个 <20000 的一个数字。
我的问题是: 这里不是调用了 thread.join() 操作么? 那执行顺序应该是 thread1 执行完了,再回到主线程,然后在执行 thread2。那结果应该是 20000 啊? 我是哪里思考的不正确啊?还望悟空老师指点迷津。
public class JoinForAdd implements Runnable {
int a = 0;
@Override
public void run() {
for (int i = 0; i < 10000; i++) {
a++;
}
}
public static void main(String[] args) throws InterruptedException {
JoinForAdd target = new JoinForAdd();
Thread thread1 = new Thread(target);
Thread thread2 = new Thread(target);
thread1.start();
thread2.start();
thread1.join();
thread2.join();
System.out.println("sum: " + target.a);
}
}
写回答
1回答
-
悟空
2019-10-07
同学你好,是这样子的:join的功能并不是让他们都串行执行,而是说,在哪个线程join,他就去等待,具体你可以看一下相关的小节,有详细介绍。在这里的情况是,主线程等待子线程1和子线程2,但是两个子线程之间互相并不等待,所以子线程1和子线程2是一起执行的,所以会计算出错。
022019-10-10
相似问题