Program współbieżny składa się z dwóch wątków X i Y. W celu realizacji wzajemnego wykluczania - w przypadku
tych dwóch wątków - student A1 zaproponował następujący protokół.Idea podstawowa: wątek X może zmieniać stan swojej zmiennej stanX i sprawdzać zmienną stanY „należącą” do
wątku Y. Analogicznie działa wątek Y.Gdy wątek X chce wejśd do sekcji krytycznej, to ustawia stanX na 1, a następnie sprawdza stan zmiennej partnera,
czyli stanY:
- jeśli stanY == 1, to proces X natychmiast ustawia stanX na 0 i po losowej chwili ponawia próbę; czyli
ustawia stanX na 1, testuje zmienną stanY etc.- jeśli stanY == 0, to proces X wchodzi do sekcji krytycznej i przez pewien czas wykonuje działania na
zasobie dzielonym.Z chwilą opuszczenia sekcji krytycznej proces X ustawia zmienną stanX na 0.
Proces Y realizuje analogiczny protokół wejścia do sekcji krytycznej, tzn. ustawia stanY na 1, a następnie sprawdza
stan zmiennej partnera, czyli stanX etc.a)
Napisz demonstracyjny program współbieżny wyłącznie w oparciu o ten algorytmem realizacji wzajemnego
wykluczania ( np. dwa procesy n-razy inkrementują zmienną dzieloną typu int).
public class Roboczy extends Thread{
private String name;
private int stanX, stanY;
private static Integer zmDzielona=0;
public Roboczy(String name){
this.name=name;
}
@Override
public void run(){
if(name.equals("X")){
stanX=1;
if(stanY==1){
try {
stanX = 0;
sleep((int) (Math.random() * 5000));
} catch (InterruptedException ex) {}
}
else if(stanY==0){ //warunek wejscia do sekcji krytycznej
synchronized(zmDzielona){
for(int i=0; i<10; i++){
zmDzielona++;
System.out.println("Watek " +name+ ":" +zmDzielona);
}
}
stanX=0;
}
}
}
}
Nie do końca rozumiem warunek gdy stanY jest równy 1, czy kod pasuje do treści zadania?
PS. Algorytm ten ma wady.