33import java .util .concurrent .ExecutorService ;
44import java .util .concurrent .Executors ;
55import java .util .concurrent .atomic .AtomicInteger ;
6+ import java .util .function .IntBinaryOperator ;
67import java .util .stream .IntStream ;
78
89/**
@@ -12,23 +13,43 @@ public class Atomic1 {
1213
1314private static final int NUM_INCREMENTS =10000 ;
1415
15- private static AtomicInteger count =new AtomicInteger (0 );
16+ private static AtomicInteger atomicInt =new AtomicInteger (0 );
1617
1718public static void main (String []args ) {
1819testIncrement ();
20+ testAccumulate ();
21+ }
22+
23+ private static void testAccumulate () {
24+ atomicInt .set (0 );
25+
26+ ExecutorService executor =Executors .newFixedThreadPool (2 );
27+
28+ IntStream .range (0 ,NUM_INCREMENTS )
29+ .forEach (i -> {
30+ Runnable task = () -> {
31+ IntBinaryOperator operator = (a ,b ) ->a +b ;
32+ atomicInt .accumulateAndGet (i ,operator );
33+ };
34+ executor .submit (task );
35+ });
36+
37+ ConcurrentUtils .stop (executor );
38+
39+ System .out .format ("Accumulate: %d\n " ,atomicInt .get ());
1940 }
2041
2142private static void testIncrement () {
22- count .set (0 );
43+ atomicInt .set (0 );
2344
2445ExecutorService executor =Executors .newFixedThreadPool (2 );
2546
2647IntStream .range (0 ,NUM_INCREMENTS )
27- .forEach (i ->executor .submit (count ::incrementAndGet ));
48+ .forEach (i ->executor .submit (atomicInt ::incrementAndGet ));
2849
2950ConcurrentUtils .stop (executor );
3051
31- System .out .format ("Expected=%d; Is=%d" ,NUM_INCREMENTS ,count .get ());
52+ System .out .format ("Increment: Expected=%d; Is=%d\n " ,NUM_INCREMENTS ,atomicInt .get ());
3253 }
3354
3455}