ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/LongAdderTest.java
Revision: 1.9
Committed: Sun Jan 28 17:38:18 2018 UTC (6 years, 2 months ago) by jsr166
Branch: MAIN
CVS Tags: HEAD
Changes since 1.8: +2 -2 lines
Log Message:
typo

File Contents

# Content
1 /*
2 * Written by Doug Lea with assistance from members of JCP JSR-166
3 * Expert Group and released to the public domain, as explained at
4 * http://creativecommons.org/publicdomain/zero/1.0/
5 */
6
7 import java.util.concurrent.CyclicBarrier;
8 import java.util.concurrent.Executors;
9 import java.util.concurrent.ExecutorService;
10 import java.util.concurrent.atomic.LongAdder;
11
12 import junit.framework.Test;
13 import junit.framework.TestSuite;
14
15 public class LongAdderTest extends JSR166TestCase {
16 public static void main(String[] args) {
17 main(suite(), args);
18 }
19 public static Test suite() {
20 return new TestSuite(LongAdderTest.class);
21 }
22
23 /**
24 * default constructed initializes to zero
25 */
26 public void testConstructor() {
27 LongAdder ai = new LongAdder();
28 assertEquals(0, ai.sum());
29 }
30
31 /**
32 * add adds given value to current, and sum returns current value
33 */
34 public void testAddAndSum() {
35 LongAdder ai = new LongAdder();
36 ai.add(2);
37 assertEquals(2, ai.sum());
38 ai.add(-4);
39 assertEquals(-2, ai.sum());
40 }
41
42 /**
43 * decrement decrements and sum returns current value
44 */
45 public void testDecrementAndSum() {
46 LongAdder ai = new LongAdder();
47 ai.decrement();
48 assertEquals(-1, ai.sum());
49 ai.decrement();
50 assertEquals(-2, ai.sum());
51 }
52
53 /**
54 * incrementAndGet increments and returns current value
55 */
56 public void testIncrementAndSum() {
57 LongAdder ai = new LongAdder();
58 ai.increment();
59 assertEquals(1, ai.sum());
60 ai.increment();
61 assertEquals(2, ai.sum());
62 }
63
64 /**
65 * reset() causes subsequent sum() to return zero
66 */
67 public void testReset() {
68 LongAdder ai = new LongAdder();
69 ai.add(2);
70 assertEquals(2, ai.sum());
71 ai.reset();
72 assertEquals(0, ai.sum());
73 }
74
75 /**
76 * sumThenReset() returns sum; subsequent sum() returns zero
77 */
78 public void testSumThenReset() {
79 LongAdder ai = new LongAdder();
80 ai.add(2);
81 assertEquals(2, ai.sum());
82 assertEquals(2, ai.sumThenReset());
83 assertEquals(0, ai.sum());
84 }
85
86 /**
87 * a deserialized/reserialized adder holds same value
88 */
89 public void testSerialization() throws Exception {
90 LongAdder x = new LongAdder();
91 LongAdder y = serialClone(x);
92 assertNotSame(x, y);
93 x.add(-22);
94 LongAdder z = serialClone(x);
95 assertNotSame(y, z);
96 assertEquals(-22, x.sum());
97 assertEquals(0, y.sum());
98 assertEquals(-22, z.sum());
99 }
100
101 /**
102 * toString returns current value.
103 */
104 public void testToString() {
105 LongAdder ai = new LongAdder();
106 assertEquals("0", ai.toString());
107 ai.increment();
108 assertEquals(Long.toString(1), ai.toString());
109 }
110
111 /**
112 * intValue returns current value.
113 */
114 public void testIntValue() {
115 LongAdder ai = new LongAdder();
116 assertEquals(0, ai.intValue());
117 ai.increment();
118 assertEquals(1, ai.intValue());
119 }
120
121 /**
122 * longValue returns current value.
123 */
124 public void testLongValue() {
125 LongAdder ai = new LongAdder();
126 assertEquals(0, ai.longValue());
127 ai.increment();
128 assertEquals(1, ai.longValue());
129 }
130
131 /**
132 * floatValue returns current value.
133 */
134 public void testFloatValue() {
135 LongAdder ai = new LongAdder();
136 assertEquals(0.0f, ai.floatValue());
137 ai.increment();
138 assertEquals(1.0f, ai.floatValue());
139 }
140
141 /**
142 * doubleValue returns current value.
143 */
144 public void testDoubleValue() {
145 LongAdder ai = new LongAdder();
146 assertEquals(0.0, ai.doubleValue());
147 ai.increment();
148 assertEquals(1.0, ai.doubleValue());
149 }
150
151 /**
152 * adds by multiple threads produce correct sum
153 */
154 public void testAddAndSumMT() throws Throwable {
155 final int incs = 1000000;
156 final int nthreads = 4;
157 final ExecutorService pool = Executors.newCachedThreadPool();
158 LongAdder a = new LongAdder();
159 CyclicBarrier barrier = new CyclicBarrier(nthreads + 1);
160 for (int i = 0; i < nthreads; ++i)
161 pool.execute(new AdderTask(a, barrier, incs));
162 barrier.await();
163 barrier.await();
164 long total = (long)nthreads * incs;
165 long sum = a.sum();
166 assertEquals(sum, total);
167 pool.shutdown();
168 }
169
170 static final class AdderTask implements Runnable {
171 final LongAdder adder;
172 final CyclicBarrier barrier;
173 final int incs;
174 volatile long result;
175 AdderTask(LongAdder adder, CyclicBarrier barrier, int incs) {
176 this.adder = adder;
177 this.barrier = barrier;
178 this.incs = incs;
179 }
180
181 public void run() {
182 try {
183 barrier.await();
184 LongAdder a = adder;
185 for (int i = 0; i < incs; ++i)
186 a.add(1L);
187 result = a.sum();
188 barrier.await();
189 } catch (Throwable t) { throw new Error(t); }
190 }
191 }
192
193 }