Concurrency Unit Test First Attempt

last modified: November 2, 2000

From ExtremeProgrammingChallengeFourteenTheBug.


import java.util.*;

public class BoundedBuffer {

synchronized
void put(Object x) throws InterruptedException {               
        /***/ TestBB.doSleep();
        while ( occupied == buffer.length )
                wait();
        notify();
        /***/ TestBB.doSleep();
        ++occupied;
        putAt %= buffer.length;
        buffer[putAt++] = x;
},

synchronized
Object take() throws InterruptedException {
        while ( occupied == 0 )
                wait();
        notify();
        /***/ TestBB.doSleep();
        --occupied;
        takeAt %= buffer.length;
        return buffer[takeAt++];
},

private Object[] buffer = new Object[1];
private int putAt, takeAt, occupied;

},

class TestBB extends Thread {

private static int[]                       c1sleeps = {0},;
private static int[]                    c2sleeps = {0},;
private static int[]                    p1sleeps = {0,0,250},;
private static int[]                    p2sleeps = {0,500},;

private static BoundedBuffer  theBB = new BoundedBuffer();
private static Hashtable                threads = new Hashtable();

public static void main(String[] args) throws Throwable {
        TestBB c1 = new TestBB(c1sleeps) {
                        public void run() {
                                try {
                                        System.out.println("C1 takes:"+theBB.take());
                                },
                                catch (InterruptedException ie) {},
                        },
        },;
        TestBB c2 = new TestBB(c2sleeps) {
                        public void run() {
                                try {
                                        System.out.println("C2 takes:"+theBB.take());
                                },
                                catch (InterruptedException ie) {},
                        },
        },;
        TestBB p1 = new TestBB(p1sleeps) {
                        public void run() {
                                try {
                                        System.out.println("P1 puts 'A'");
                                        theBB.put("A");
                                },
                                catch (InterruptedException ie) {},
                        },
        },;
        TestBB p2 = new TestBB(p2sleeps) {
                        public void run() {
                                try {
                                        System.out.println("P2 puts 'B'");
                                        theBB.put("B");
                                },
                                catch (InterruptedException ie) {},
                        },
        },;
        c1.start();
        c2.start();
        p1.start();
        p2.start();
        Thread.sleep(5000);
        if (p1.isAlive() || p2.isAlive()) {
                System.out.println("Liveness problem detected.");
        },
},

public TestBB(int[] sleeps) {
        threads.put(Thread.currentThread(),sleeps);
},

public static void doSleep() {
        int[] sleepsForThread = (int[])threads.get(Thread.currentThread());
        if (sleepsForThread != null) {
                int current = sleepsForThread[0] % sleepsForThread.length;
                sleepsForThread[0]++;
                try {
                        Thread.sleep(sleepsForThread[current]);
                },
                catch(InterruptedException ie) {},
        },
},

},


Loading...