equal
deleted
inserted
replaced
301 } |
301 } |
302 } |
302 } |
303 |
303 |
304 class Counter extends CheckedRunnable { |
304 class Counter extends CheckedRunnable { |
305 final AtomicIntegerArray aa; |
305 final AtomicIntegerArray aa; |
306 volatile int counts; |
306 int decs; |
307 Counter(AtomicIntegerArray a) { aa = a; } |
307 Counter(AtomicIntegerArray a) { aa = a; } |
308 public void realRun() { |
308 public void realRun() { |
309 for (;;) { |
309 for (;;) { |
310 boolean done = true; |
310 boolean done = true; |
311 for (int i = 0; i < aa.length(); i++) { |
311 for (int i = 0; i < aa.length(); i++) { |
312 int v = aa.get(i); |
312 int v = aa.get(i); |
313 assertTrue(v >= 0); |
313 assertTrue(v >= 0); |
314 if (v != 0) { |
314 if (v != 0) { |
315 done = false; |
315 done = false; |
316 if (aa.compareAndSet(i, v, v - 1)) |
316 if (aa.compareAndSet(i, v, v - 1)) |
317 ++counts; |
317 decs++; |
318 } |
318 } |
319 } |
319 } |
320 if (done) |
320 if (done) |
321 break; |
321 break; |
322 } |
322 } |
332 int countdown = 10000; |
332 int countdown = 10000; |
333 for (int i = 0; i < SIZE; i++) |
333 for (int i = 0; i < SIZE; i++) |
334 aa.set(i, countdown); |
334 aa.set(i, countdown); |
335 Counter c1 = new Counter(aa); |
335 Counter c1 = new Counter(aa); |
336 Counter c2 = new Counter(aa); |
336 Counter c2 = new Counter(aa); |
337 Thread t1 = new Thread(c1); |
337 Thread t1 = newStartedThread(c1); |
338 Thread t2 = new Thread(c2); |
338 Thread t2 = newStartedThread(c2); |
339 t1.start(); |
|
340 t2.start(); |
|
341 t1.join(); |
339 t1.join(); |
342 t2.join(); |
340 t2.join(); |
343 assertEquals(c1.counts+c2.counts, SIZE * countdown); |
341 assertEquals(c1.decs + c2.decs, SIZE * countdown); |
344 } |
342 } |
345 |
343 |
346 /** |
344 /** |
347 * a deserialized serialized array holds same values |
345 * a deserialized serialized array holds same values |
348 */ |
346 */ |