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 - 同步访问方法时是否需要集契约(Contract)步(通过 Collections.synchronizedX)?

java - 运行 3 个线程并在 Java 中等待

java - 为什么我收到 javax.mail.AuthenticationFailedException?

java - 如何访问 jython 代码中的 javas ".class"属性?

.net - 不可能(我讨厌使用这个词)交叉线程错误?

c# - 在关闭表单之前等待任务完成

java - 如何使用 Java codeModel 为数组的特定索引赋值

java - 如何包含文件中的类路径?

C++ std::memory_order_relaxed 和跳过/停止标志

java - 多线程访问内存