并发 ExecutorService 计数器从 1 到 N
并发 ExecutorService 计数器从 1 到 N
嗨!
我正在练习并努力应对并发性。
现在,我正在尝试使用ExecutorService计算从1到N(在我的示例中是1000)的数字,但不幸的是我无法得到期望的结果。下面是我的代码:
class Exec { AtomicInteger sum = new AtomicInteger(0); public static void main(String[] args) { for (int i = 0; i < 30; i++) { Exec exec = new Exec(); exec.run(exec); } } public void run(Exec exec) { ExecutorService executorService = Executors.newFixedThreadPool(5); IntStream.range(0, 1000).parallel().forEach(x -> executorService.submit(exec::synchCalc)); executorService.shutdown(); System.out.println(sum.get()); } public synchronized void synchCalc() { sum.incrementAndGet(); } }
输出结果为:
940 980 976 973 1000 1000 960 968 969 996 969 969 1000 938 997 0 1000 999 1000 734 999 969 1000 238 969 999 969 971 465 999
我尝试了几种解决方法:使用volatile代替AtomicInteger,几乎同步每个方法,但结果仍然一样 - 我从来没有得到全部的1000,我真的不知道为什么。
我将非常感谢任何帮助!