public static final int MAX_BUFFER = 10;
public static Semaphore emptyCount = new Semaphore(MAX_BUFFER);
public static Semaphore fillCount = new Semaphore(0);
public static int[] buffer = new int[MAX_BUFFER];
public static void produce() {
int i = random.nextInt(100);
int n = MAX_BUFFER - emptyCount.availablePermits();
if (emptyCount.tryAcquire() == true) {
buffer[n] = i;
System.out.println("Producer: " + i);
fillCount.release();
}
}
public static void consume() {
if (fillCount.tryAcquire() == true) {
int i = buffer[fillCount.availablePermits()];
buffer[fillCount.availablePermits()] = -1;
System.out.println("Consumer: " + i);
emptyCount.release();
}
}
produce() i run() działają w dwóch równoległych wątkach. W pewnym momencie po uruchomieniu programu dostaję błąd
Exception in thread "Thread-0" java.lang.ArrayIndexOutOfBoundsException: 10
at BoundedBuffer.produce(BoundedBuffer.java:45)
at BoundedBuffer$1.run(BoundedBuffer.java:17)
at java.lang.Thread.run(Thread.java:748)
Thread-0 czyli wątek wykonujący produce(). Spowodowane jest to tym że tablica buffer ma dostępne jedynie 10 miejsc a w pewnym momencie int n = MAX_BUFFER - emptyCount.availablePermits(); zwraca wartość 10 (a nie powinna ona przekraczać 9). Gdy zwiększę ilość miejsc w tabeli do 11 to nie pojawiają się żadne błędy, jednak tabela według założenia nie powinna być większa niż 10. Z czego wynika ten błąd i czy w ogóle moja implementacja problemu producenta i konsumenta przy użyciu semafor jest prawidłowa?