4 |
|
* http://creativecommons.org/publicdomain/zero/1.0/ |
5 |
|
*/ |
6 |
|
|
7 |
< |
import junit.framework.*; |
8 |
< |
import java.util.concurrent.*; |
7 |
> |
import java.util.concurrent.CyclicBarrier; |
8 |
> |
import java.util.concurrent.Executors; |
9 |
> |
import java.util.concurrent.ExecutorService; |
10 |
|
import java.util.concurrent.atomic.DoubleAdder; |
11 |
|
|
12 |
+ |
import junit.framework.Test; |
13 |
+ |
import junit.framework.TestSuite; |
14 |
+ |
|
15 |
|
public class DoubleAdderTest extends JSR166TestCase { |
16 |
|
public static void main(String[] args) { |
17 |
|
junit.textui.TestRunner.run(suite()); |
128 |
|
/** |
129 |
|
* adds by multiple threads produce correct sum |
130 |
|
*/ |
131 |
< |
public void testAddAndSumMT() { |
131 |
> |
public void testAddAndSumMT() throws Throwable { |
132 |
|
final int incs = 1000000; |
133 |
|
final int nthreads = 4; |
134 |
|
final ExecutorService pool = Executors.newCachedThreadPool(); |
135 |
|
DoubleAdder a = new DoubleAdder(); |
136 |
< |
Phaser phaser = new Phaser(nthreads + 1); |
136 |
> |
CyclicBarrier barrier = new CyclicBarrier(nthreads + 1); |
137 |
|
for (int i = 0; i < nthreads; ++i) |
138 |
< |
pool.execute(new AdderTask(a, phaser, incs)); |
139 |
< |
phaser.arriveAndAwaitAdvance(); |
140 |
< |
phaser.arriveAndAwaitAdvance(); |
138 |
> |
pool.execute(new AdderTask(a, barrier, incs)); |
139 |
> |
barrier.await(); |
140 |
> |
barrier.await(); |
141 |
|
double total = (long)nthreads * incs; |
142 |
|
double sum = a.sum(); |
143 |
|
assertEquals(sum, total); |
146 |
|
|
147 |
|
static final class AdderTask implements Runnable { |
148 |
|
final DoubleAdder adder; |
149 |
< |
final Phaser phaser; |
149 |
> |
final CyclicBarrier barrier; |
150 |
|
final int incs; |
151 |
|
volatile double result; |
152 |
< |
AdderTask(DoubleAdder adder, Phaser phaser, int incs) { |
152 |
> |
AdderTask(DoubleAdder adder, CyclicBarrier barrier, int incs) { |
153 |
|
this.adder = adder; |
154 |
< |
this.phaser = phaser; |
154 |
> |
this.barrier = barrier; |
155 |
|
this.incs = incs; |
156 |
|
} |
157 |
|
|
158 |
|
public void run() { |
159 |
< |
phaser.arriveAndAwaitAdvance(); |
160 |
< |
DoubleAdder a = adder; |
161 |
< |
for (int i = 0; i < incs; ++i) |
162 |
< |
a.add(1.0); |
163 |
< |
result = a.sum(); |
164 |
< |
phaser.arrive(); |
159 |
> |
try { |
160 |
> |
barrier.await(); |
161 |
> |
DoubleAdder a = adder; |
162 |
> |
for (int i = 0; i < incs; ++i) |
163 |
> |
a.add(1.0); |
164 |
> |
result = a.sum(); |
165 |
> |
barrier.await(); |
166 |
> |
} catch (Throwable t) { throw new Error(t); } |
167 |
|
} |
168 |
|
} |
169 |
|
|