public class SynchroExample {
public final AtomicInteger integer = new AtomicInteger(0);
private ExecutorService service = Executors.newFixedThreadPool(100);
public void syn() {
for (int i = 0; i < 1000; i++) {
service.submit(() -> {
integer.incrementAndGet();
});
}
service.shutdown();
System.out.println(integer.get());
}
public static void main(String [] args) {
SynchroExample ex = new SynchroExample();
ex.syn();
}
}
有人可以解释为什么此代码不起作用吗?我的印象是AtomicInteger是线程安全的。而且此代码不会返回1000。
答案 0 :(得分:3)
AtomicInteger
是线程安全的,但是您在所有任务完成之前已调用AtomicInteger#get
。 ExecutorService#shutdown
不在等待任务完成。
请参见ExecutorService#shutdown
docs:
此方法不等待先前提交的任务完成执行。使用awaitTermination可以做到这一点。
使用
service.awaitTermination(10, TimeUnit.SECONDS)
等待所有任务完成。