Nie miałem problemu z rozwiązaniem poprawnym, natomiast nie mogę sobie poradzić z zagłodzeniem pisarzy i czytelników.
Wymyśliłem coś takiego:
Pocżatek w obu przypadkach ten sam:
private boolean chcePisac = true;
private boolean chceCzytac = false;
private int iluCzyta = 0;
private int iluPisze = 0;
Zagłodznie czytelników (za wiki: "Czytelnicy nie mają obowiązku czekania na otrzymanie dostępu do zasobu, jeśli w danym momencie nie otrzymał go pisarz"):
public synchronized void rozpocznijCzytanie() throws InterruptedException{
chceCzytac = true;
iluCzyta++;
notifyAll();
}
public synchronized void zakonczCzytanie() throws InterruptedException{
chceCzytac = false;
iluCzyta--;
if(iluCzyta == 0)
notifyAll();
}
public synchronized void rozpocznijPisanie() throws InterruptedException{
chcePisac = true;
while(iluCzyta + iluPisze > 0)
wait();
iluPisze++;
}
public synchronized void zakonczPisanie() throws InterruptedException{
chcePisac = false;
iluPisze--;
if(chceCzytac)
notifyAll();
}
Zagłodzeni pisarze: (za wiki: "Czytelnicy nie mogą otrzymać dostępu do zasobu, jeżeli oczekuje na niego pisarz")
public synchronized void rozpocznijCzytanie() throws InterruptedException{
chceCzytac = true;
while(chcePisac)
wait();
iluCzyta++;
notifyAll();
}
public synchronized void zakonczCzytanie() throws InterruptedException{
chceCzytac = false;
iluCzyta--;
if(iluCzyta == 0)
notifyAll();
}
public synchronized void rozpocznijPisanie() throws InterruptedException{
chcePisac = true;
while(iluCzyta + iluPisze > 0)
wait();
iluPisze++;
}
public synchronized void zakonczPisanie() throws InterruptedException{
chcePisac = false;
iluPisze--;
if(chceCzytac)
notifyAll();
}
I tu moje pytanie : czy to jest poprawne rozwiązanie? Proszę o podpowiedzi