[concurrency-interest] ThreadPoolExecutorTest occasionally failswith a broken barrier!?
Joe Bowbeer
joe.bowbeer at gmail.com
Tue Feb 13 22:05:37 EST 2007
but getParties returns parties, which is final...
On 2/13/07, David Holmes <dcholmes at optusnet.com.au> wrote:
>
> Oliver,
>
> You have a race condition testing the count against the barrier parties.
> Between the change of the count and the test of getParties() other threads
> could have hit the barrier. As a result the current thread doesn't wait on
> the barrier, and as a result of that any threads already at the barrier
> will
> eventually timeout, hence the broken barrier.
>
> David Holmes
>
> > -----Original Message-----
> > From: concurrency-interest-bounces at cs.oswego.edu
> > [mailto:concurrency-interest-bounces at cs.oswego.edu]On Behalf Of Oliver
> > Pfeiffer
> > Sent: Wednesday, 14 February 2007 8:22 AM
> > To: concurrency-interest at cs.oswego.edu
> > Subject: [concurrency-interest] ThreadPoolExecutorTest occasionally
> > failswith a broken barrier!?
> >
> >
> > Hi,
> >
> > I'm wondering why the given JUnit test (shown below) occasionally
> > fails with
> > a broken barrier on multi processor systems using Java 5. The repetitive
> > test fails 27 times of 10.000 runs on my dual-core system. The test
> should
> > check wheter the acquired maximum number of simultaneous pool threads
> are
> > usable and that the pool doesn't fail even when the internal task queue
> is
> > full (caller runs policy).
> >
> > Greetings
> > Oliver
> >
> > =====================
> >
> > import java.util.concurrent.CountDownLatch;
> > import java.util.concurrent.CyclicBarrier;
> > import java.util.concurrent.SynchronousQueue;
> > import java.util.concurrent.ThreadPoolExecutor;
> > import java.util.concurrent.TimeUnit;
> > import java.util.concurrent.atomic.AtomicInteger;
> >
> > import junit.extensions.RepeatedTest;
> > import junit.framework.Test;
> > import junit.framework.TestCase;
> >
> > public class ThreadPoolExecutorTest extends TestCase {
> >
> > private static final ThreadPoolExecutor THREAD_POOL_EXECUTOR =
> > new ThreadPoolExecutor(
> > 0, 16, 10, TimeUnit.SECONDS,
> > new SynchronousQueue<Runnable>(),
> > new ThreadPoolExecutor.CallerRunsPolicy()
> > );
> >
> > public ThreadPoolExecutorTest(String name) {
> > super(name);
> > }
> >
> > public static Test suite() {
> > return new RepeatedTest(
> > new ThreadPoolExecutorTest("testThreadPoolExecutor"), 10000
> > );
> > }
> >
> > public void testThreadPoolExecutor() throws InterruptedException {
> > final int threads = THREAD_POOL_EXECUTOR.getMaximumPoolSize();
> > final int loops = threads * 16;
> > final CountDownLatch latch = new CountDownLatch(loops);
> > final AtomicInteger counter = new AtomicInteger();
> > final CyclicBarrier barrier = new CyclicBarrier(threads + 1);
> > for (int i = 0; i < loops; i++) {
> > THREAD_POOL_EXECUTOR.submit(new Runnable() {
> > public void run() {
> > if (counter.incrementAndGet() <= barrier.getParties()) {
> > try {
> > barrier.await(1, TimeUnit.SECONDS);
> > } catch (Exception ign) {
> > // can be ignored (broken barrier is tested below)
> > }
> > }
> > latch.countDown();
> > }
> > });
> > }
> > assertTrue(latch.await(2, TimeUnit.SECONDS));
> > assertFalse(barrier.isBroken());
> > assertEquals(0, barrier.getNumberWaiting());
> > assertEquals(loops, counter.get());
> > }
> >
> > }
> >
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: /pipermail/attachments/20070213/c72f9a08/attachment-0001.html
More information about the Concurrency-interest
mailing list