public class SemProducerConsumer { private int N, buf[], nxtC, nxtR; private Semaphore cSem, rSem; public SemProducerConsumer (int N) { this.N = N; buf = new int[N]; nxtC = 0; nxtR = 0; cSem = new Semaphore(N); rSem = new Semaphore(0); } public void Insert (int i) { cSem.P(); buf[nxtC] = i; nxtC = (nxtC + 1) % N; rSem.V(); } public int Remove () { int i; rSem.P(); i = buf[nxtR]; nxtR = (nxtR + 1) % N; cSem.V(); return i; } }