java - AtomicInteger 的多线程不起作用

标签 java multithreading

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#getExecutorService#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/

相关文章:

java - 使用 Retrofit 选择某个 ID

Java while 循环和线程!

c# - Monitor.PulseAll() 中需要帮助

java - R 中的 Weka 不工作 - 无法通过 WPM 加载 weka 包

java - 在方法之间传递 jedis 实例是一种不好的做法吗?

java - 同步锁和单独的线程: Android

performance - 高效的独立同步块(synchronized block)?

java - Glassfish 异步仅使用 4 个核心中的 2 个。我如何告诉它使用全部 4 个核心?或者至少3个?

java - 是否可以使用我的自定义序列化或使用外部化来序列化类的 transient 字段?

java - Eclipse 中更好的标记显示