翔仔老师,请教一个问题

来源:1-2 面试准备

不会说话的鱼

2022-01-02

翔仔老师,关于并发问题的请教,下面是我写的代码

    public static AtomicInteger result = new AtomicInteger(0);
    public static void main(String[] args) {

        final int total = 2;
        ExecutorService exec = Executors.newCachedThreadPool();
        for (int i = 0;i < 4;i++){
            exec.execute(() -> {
                for (int j = 0; j < total; j++) {
                    result.incrementAndGet();
                }
            });
        }
        exec.shutdown();
        System.out.println(result);
    }

这个的输出结果不稳定,60%的情况输出6,还有输出4,输出8的,正常情况应该是输出8,想请教下老师原因,这个多线程哪里出了问题

写回答

1回答

翔仔

2022-01-04

同学好,automic本身是没问题线程安全的,那么应该反推是程序提前结束了。这个在执行exec.shutdown()时是不会等待已经提交的任务都执行完毕的,所有偶然有时候没有来得及执行完,就不会输出8了。用exec.awaitTermination(1, TimeUnit.SECONDS); 我执行了1000次,都是会输出8的

this method does not wait for previously submitted tasks to
* complete execution. Use {@link #awaitTermination awaitTermination}
* to do that.

0
0

剑指Java面试-Offer直通车 百度资深面试官授课

招聘季即将到来,让百度资深面试官来为你的高薪Offer保驾护航

8444 学习 · 1872 问题

查看课程