• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Problem producenta i konsumenta semafory (bounded-buffer) - ArrayIndexOutOfBoundsException

Mały hosting, OGROMNE możliwości
0 głosów
1,076 wizyt
pytanie zadane 12 grudnia 2017 w Java przez littlerunaway Obywatel (1,790 p.)
	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?

1 odpowiedź

0 głosów
odpowiedź 12 grudnia 2017 przez Mateusz51 Nałogowiec (28,180 p.)
MAX_BUFFER - emptyCount.availablePermits() może równać się 10 jeśli emptyCount nie będzie miał żadnych zezwoleń.

Podobne pytania

0 głosów
0 odpowiedzi 496 wizyt
pytanie zadane 8 listopada 2022 w Java przez CanoNee Nowicjusz (230 p.)
0 głosów
0 odpowiedzi 392 wizyt
pytanie zadane 4 listopada 2019 w Java przez olimpiqem Nowicjusz (120 p.)
0 głosów
1 odpowiedź 3,527 wizyt
pytanie zadane 10 kwietnia 2019 w Java przez mn130496 Gaduła (3,640 p.)

93,715 zapytań

142,629 odpowiedzi

323,260 komentarzy

63,257 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...