Java dwa synchronizowanie blocki

Java dwa synchronizowanie blocki
DU
  • Rejestracja:około 13 lat
  • Ostatnio:około 9 lat
  • Postów:26
0

Chcę rozwiązać problem producentów i konsumentów (wiele, wiele).

Napisałem sobie program, który wykorzystuje klasę Data:

Kopiuj
package tpsa;

public class Data {

	public int[] tab;
	public int n;
	public Object producentsLock = new Object();
	public Object consumersLock = new Object();
	public Object mutex = new Object();

	public Data(int n) throws Exception {
		this.n = 0;
		tab = new int[n];
		
	}

	public void Push(int x) {
		synchronized (producentsLock) {
			System.err.println("Push producentsLock locked");
			
			while (n >= tab.length - 1)
				try {
					System.err.println("Push za mało miejsca");
					producentsLock.wait();
				} catch (InterruptedException e) {
				}
			
			synchronized (consumersLock) {
				System.err.println("Push consumersLock locked");

				tab[n] = x;
				n++;

				consumersLock.notify();
			}
			System.err.println("Push consumersLock unlocked");
		}
		System.err.println("Push producentLock unlocked");
	}

	public int Pop() {
		int var = 0;
		synchronized (producentsLock) {
			System.err.println("Pop producentsLock locknięty");
			
			while (n <= 0)
				try {
					System.err.println("Pop nie ma danych");
					consumersLock.wait();
				} catch (InterruptedException e) {
				}
			
			synchronized (consumersLock) {
				System.err.println("Pop consumersLock locknięty");
				var = tab[n - 1];
				n--;

				producentsLock.notify();

			}
			System.err.println("Pop consumersLock unlocked");
		}
		System.err.println("Pop producentsLock unlocked");
		return var;
	}

}

Wszystko działa dla push, dla pop'a zaczynają się schody. Ponieważ, aby uniknąć deadlock'a to muszę lockować w odpowiedniej, tej samej kolejności. Jednakże, dla pusha jest to łatwe (bo wynika z tego, że robimy to tak, jak push tego wymaga). Dla popa jest trudniej, ponieważ musimy na raz zalockować, ale też sprawdzić, czy możemy to zrobić. Jeżeli nie ma elementów to musimy dać wait, ale jesteśmy locknięci 2 blokach, czyli też blokujemy producentów jak i konsumentów (czyli zacina sie). Jak ten problem rozwiązać w javie?

Shalom
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

A musisz to tak śmiesznie pisać? Bo wiesz że java ma coś takiego jak Locki, Mutexy i Semafory? Czemu nie zrobisz tego jak człowiek?


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
DU
A bo się uczę ;>? Prowadzący zrobił może z 5 wykładów i uznał, że umiemy javę ;p
Antoniossss
o semaforach i mutexach i tak by nic Wam nie powiedział, a o locku nie wiadomo czy by wspomniał omawiając synchronizacje (a na pewno by locka lockiem nie nazwał:P)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.