class BoundedBuffer2 {
final int sizeBuf = 10;
double[] buffer = new double[sizeBuf];
int inBuf = 0, outBuf = 0, count = 0;
BinarySemaphore mutex = new BinarySemaphore(true);
BinarySemaphore isEmpty = new BinarySemaphore(false);
BinarySemaphore isFull = new BinarySemaphore(true);
public void deposit(double value) {
mutex.P();
while (count == sizeBuf) {
mutex.V();
isFull.P();
mutex.P();
}
buffer[inBuf] = value;
inBuf = (inBuf + 1) % sizeBuf;
count++;
if (count == 1) isEmpty.V();
mutex.V();
}
public double fetch() {
double value;
mutex.P();
while (count == 0) {
mutex.V();
isEmpty.P();
mutex.P();
}
value = buffer[outBuf];
outBuf = (outBuf + 1) % sizeBuf;
count--;
if (count == sizeBuf - 1) isFull.V();
mutex.V();
return value;
}
}