programmera.net -> java -> normal för utskrift | info@programmera.net |
Låsning
1. Vad är låsning? 2. Behovet av låsning 3. Huvudminne och arbetsminne 4. Låsning med monitorer 5. synchronized 6. Readers/Writers |
1. Vad är låsning?
En tråd har låst ett objekt om alla andra trådar tvingas att vänta då de försöker låsa objektet.
2. Behovet av låsning
Man måste låsa ett objekt i dessa fall:
3. Huvudminne och arbetsminne
Nu kommer några nya begrepp lanseras:
Om ingen låsning sker får vilken tråd som helst läsa och skriva till objektets huvudvariabler.
4. Låsning med monitorer
Nedan beskrivs hur en monitor sköter låsning:
Som synes sker låsning helt automatiskt av monitorn, det enda man behöver göra är att tala om för monitorn vilka objekt som behöver skyddas och i vilka fall detta ska ske. Genom att deklarera en metod eller ett block som synchronized säger man till monitorn att låsa objektet då någon tråd går in i metoden.
5. synchronized
Nedan beskrivs hur nyckelordet synchronized fungerar i Java. Vi börjar med begreppet synchronized-block. Ett synchronized-block kan skapas på två sätt:
Att deklarerar ett block som synchronized ser ut såhär:
Obj är vanligen objektet självt, dvs this. Nedan försöker jag sammanfatta reglerna för låsning:
synchronized(Obj){
// something..
}
6. Readers/Writers
Genom att tillämpa våra nya kunskaper kan vi modifiera klassen Controller i exemplet som beskrevs på sidan
Readers/Writers . Den nya kontroller ser ut såhär:
Det enda vi har gjort är att göra metoderna synchronized.
// CONTROLLER
// This is the class we will modify
// to solve the readers/writers problem
class Controller{
Resource res;
public Controller(Resource resource){
this.res=resource;
}
public synchronized void read(UserThread t){
res.read(t);
}
public synchronized void write(UserThread t){
res.write(t);
}
}
Nedan visas en körning av programmet med gjorda förändringar:
Vi ser att vi har lyckats begränsa trådarna så att endast en tråd i taget har tillgång till Resource. Som programmet fungerar nu är skrivar-tråden ensam om objektet då den använder Resource.write(), detta är bra. Men tyvärr gäller samma sak för läsarna. Endast en läsare i taget har tillgång till Resource.read(). För att lösa problemet readers/writers måste vi låta läsarna anropa Resource.read() parallellt.
[olle@dev1]$ java ReadersWriters 3 3 3
All readers and writers are created!
|R |
| |
|R |
| |
|R |
| |
|W |
| |
|W |
| |
|W |
| |
|R |
| |
|R |
| |
|W |
| |
|R |
| |
|W |
| |
|W |
| |
|R |
| |
|R |
| |
|W |
| |
|R |
| |
|W |
| |
|W |
| |