使用AtomicInteger的多线程不起作用

时间:2018-07-21 00:06:48

标签: 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。

1 个答案:

答案 0 :(得分:3)

AtomicInteger是线程安全的,但是您在所有任务完成之前已调用AtomicInteger#getExecutorService#shutdown不在等待任务完成。

请参见ExecutorService#shutdown docs

  

此方法不等待先前提交的任务完成执行。使用awaitTermination可以做到这一点。

使用

service.awaitTermination(10, TimeUnit.SECONDS)

等待所有任务完成。