翔仔老师,请教一个问题
来源: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.00
相似问题
翔仔你好,问一个课程内容之外的问题
回答 1
老师,请教个多次请求的问题
回答 1
关于B-tree叶子节点的问题
回答 1
Spring那一章没有内容
回答 4
翔仔好!想请教一个面试遇到的问题!
回答 1