programmera.net -> java -> normal för utskrift | info@programmera.net |
Villkorssynkronisering
1. Vad är villkorssynkronisering? 2. wait() och notify() 3. Readers/Writers |
1. Vad är villkorssynkronisering?
Villkorssynkronisering innebär att en tråd tvingas att vänta tills ett villkor har uppfyllts.
2. wait() och notify()
Då man programmerar villkorssynkronisering måste man explicit skriva att en tråd ska vänta och på vad. I Java finns det inget sätt för en tråd att fördröjja en annan tråd. Det enda sättet att fördröjja en tråd är att tråden säger åt sig själv att vänta. Villkorsfördröjningar programmeras på följande sätt: Varje monitor har en fördröjningslista där trådar kan placeras. Ett objekt kan tvinga den exekverande tråden att till fördröjningslistan med wait(), och sedan låta en annan tråd frigöra den med notify(). Följande regler gäller:
Nedan beskrivs hur wait() och notify() används:
3. Readers/Writers
En brutal lösning på problemet med readers/writers presenterades på sidan
låsning . Den lösningen hade nackdelen att den inte tillåter inte parallella läsningar. Nu kan vi med hjälp av wait() och notify() konstruera en lösning som tillåter parallella läsningar. Vi ersätter classen Controller med:
Följande delar i Controller bör påpekas:
// CONTROLLER
// This is the class we will modify
// to solve the readers/writers problem
class Controller{
Resource res;
int cr=0; // Number of current readers
public Controller(Resource resource){
this.res=resource;
}
public void read(UserThread t){
synchronized(this){
cr++;
}
res.read(t);
synchronized(this){
cr--;
if(cr==0) notify(); // Signal one waiting reader
}
}
public synchronized void write(UserThread t){
while(cr>0) {
try{ wait(); }
catch(Exception e){}
}
res.write(t);
notify(); // Signal one waiting reader
}
}
En utskrift av programmet kan se ut på följande sätt:
Vi ser att flera läsare R är inne i klassen Resource, men att skrivarna W bara kan gå in en åt gången. Ett allmänt drag för denna metod är att den inte är speciellt rättvis. Läsarna verkar få förtur till resursen. Vi återkommer till problemet på sidan om
semaforer .
[olle@dev1]$ java ReadersWriters 3 3 3
All readers and writers are created!
|R |
|RR |
|RRR |
|RR |
|R |
| |
|W |
| |
|R |
|RR |
|RRR |
|RR |
|R |
| |
|W |
| |
|W |
| |
|W |
| |
|R |
|RR |
|RRR |
|RR |
|R |
| |
|W |
| |
|W |
| |
|W |
| |
|W |
| |
|W |
| |