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。
最佳答案
AtomicInteger
是线程安全的,但是您在所有任务完成之前调用了 AtomicInteger#get
。 ExecutorService#shutdown
没有等待任务完成。
参见 ExecutorService#shutdown
docs :
This method does not wait for previously submitted tasks to complete execution. Use awaitTermination to do that.
使用
service.awaitTermination(10, TimeUnit.SECONDS)
等待所有任务完成。
关于java - AtomicInteger 的多线程不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51451705/