public class BoundedBuffer { private java.util.List buffer = java.util.Collections.synchronizedList (new java.util.LinkedList()); private static final int SIZE = 20; // arbitrary private Semaphore occupiedSem = new Semaphore(0); private Semaphore freeSem = new Semaphore(SIZE); /* invariant: occupiedSem + freeSem = SIZE buffer.size() = occupiedSem buffer contains entries from oldest to youngest */ public void insert(Object o) throws InterruptedException{ freeSem.down(); buffer.add(o); occupiedSem.up(); } public Object retrieve() throws InterruptedException{ occupiedSem.down(); Object retrieved = buffer.remove(0); freeSem.up(); return retrieved; } }