Concurrency Unit Test First AttemptFrom 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 BoundedBuffertheBB = new BoundedBuffer();
private static Hashtablethreads = 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) {}
}
}
}
EditText of this page
(last edited November 2, 2000)
or FindPage with title or text search