85 |
|
public void testSerialization() throws Exception { |
86 |
|
LongAdder x = new LongAdder(); |
87 |
|
LongAdder y = serialClone(x); |
88 |
< |
assertTrue(x != y); |
88 |
> |
assertNotSame(x, y); |
89 |
|
x.add(-22); |
90 |
|
LongAdder z = serialClone(x); |
91 |
+ |
assertNotSame(y, z); |
92 |
|
assertEquals(-22, x.sum()); |
93 |
|
assertEquals(0, y.sum()); |
94 |
|
assertEquals(-22, z.sum()); |
147 |
|
/** |
148 |
|
* adds by multiple threads produce correct sum |
149 |
|
*/ |
150 |
< |
public void testAddAndSumMT() { |
150 |
> |
public void testAddAndSumMT() throws Throwable { |
151 |
|
final int incs = 1000000; |
152 |
|
final int nthreads = 4; |
153 |
|
final ExecutorService pool = Executors.newCachedThreadPool(); |
154 |
|
LongAdder a = new LongAdder(); |
155 |
< |
Phaser phaser = new Phaser(nthreads + 1); |
155 |
> |
CyclicBarrier barrier = new CyclicBarrier(nthreads + 1); |
156 |
|
for (int i = 0; i < nthreads; ++i) |
157 |
< |
pool.execute(new AdderTask(a, phaser, incs)); |
158 |
< |
phaser.arriveAndAwaitAdvance(); |
159 |
< |
phaser.arriveAndAwaitAdvance(); |
157 |
> |
pool.execute(new AdderTask(a, barrier, incs)); |
158 |
> |
barrier.await(); |
159 |
> |
barrier.await(); |
160 |
|
long total = (long)nthreads * incs; |
161 |
|
long sum = a.sum(); |
162 |
|
assertEquals(sum, total); |
165 |
|
|
166 |
|
static final class AdderTask implements Runnable { |
167 |
|
final LongAdder adder; |
168 |
< |
final Phaser phaser; |
168 |
> |
final CyclicBarrier barrier; |
169 |
|
final int incs; |
170 |
|
volatile long result; |
171 |
< |
AdderTask(LongAdder adder, Phaser phaser, int incs) { |
171 |
> |
AdderTask(LongAdder adder, CyclicBarrier barrier, int incs) { |
172 |
|
this.adder = adder; |
173 |
< |
this.phaser = phaser; |
173 |
> |
this.barrier = barrier; |
174 |
|
this.incs = incs; |
175 |
|
} |
176 |
|
|
177 |
|
public void run() { |
178 |
< |
phaser.arriveAndAwaitAdvance(); |
179 |
< |
LongAdder a = adder; |
180 |
< |
for (int i = 0; i < incs; ++i) |
181 |
< |
a.add(1L); |
182 |
< |
result = a.sum(); |
183 |
< |
phaser.arrive(); |
178 |
> |
try { |
179 |
> |
barrier.await(); |
180 |
> |
LongAdder a = adder; |
181 |
> |
for (int i = 0; i < incs; ++i) |
182 |
> |
a.add(1L); |
183 |
> |
result = a.sum(); |
184 |
> |
barrier.await(); |
185 |
> |
} catch (Throwable t) { throw new Error(t); } |
186 |
|
} |
187 |
|
} |
188 |
|
|