悟空老师,看到 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是一起执行的,所以会计算出错。

0
2
悟空
回复
ice_wolf
对的,这是由happens-before保证的。
2019-10-10
共2条回复

线程八大核心+Java并发原理及企业级并发解决方案

完整的并发知识网络+丰富的工作内容分享+50余道并发高频面试题

2512 学习 · 939 问题

查看课程