Java dwa synchronizowanie blocki

0

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

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

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?

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?

1 użytkowników online, w tym zalogowanych: 0, gości: 1