请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

翔仔老师,请教一个问题

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

    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,想请教下老师原因,这个多线程哪里出了问题

正在回答 回答被采纳积分+3

1回答

翔仔 2022-01-04 00:27:53

同学好,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 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号