Synchronisierung Es gibt CodeBereiche (zB

Werbung
SOTE1­2016­12­05.notebook
December 05, 2016
Synchronisierung
Es gibt Code­Bereiche (z.B. Methoden), die nicht(!) gleichzeitig von mehreren Threads durchlaufen werden dürfen. Beispielsweise wäre es unerwünscht, wenn die Methode drucken() eines Druckerspoolers gleichhzeitig/parallel durchlaufen würde.
Variante 1: Synchronisierung einer ganzen Methode
(ab Java 1)
Variante 2: Synchronisierung eines Teils einer
Methode (ab Java 1)
Variante 3: Synchronisierung eines Teils einer
Methode (ab Java 5)
1
SOTE1­2016­12­05.notebook
December 05, 2016
1. Beispiel für Multi­Threading Problem: Zugriff auf "Ressource" counter
1. Wert aus Variable counter ausgelesen
2. Wert wir um eins erhöht
3. Wert neu in Variable counter setzen
Thread 1
Thread 2
List Wert aus counter (1)
manchmal kommt hier zwei mal "1"
Gibt Wert zurück (1)
Thread unterbrochen
Thread fortgesetzt
Erhöht Wert um 1 (2)
counter neu setzen (2)
Liest Wert aus counter (1)
Gibt Wert zurück (1)
Erhöht Wert um 1 (2)
counter neu setzen (2)
2
SOTE1­2016­12­05.notebook
December 05, 2016
2. Beispiel für Multi­Threading Problem: Bank (Code ist auf Webseite)
Konto 1
Konto 2
Regulär
1. Transaktion: 20 Euro von Konto 1 auf Konto 2
2. Transaktion: 30 Euro von Konto 2 auf Konto 1
Nach regulären Transaktionen ist Kontostand von Konto 2 ist ­10
Problem bei Multi­Threading
1. Transaktion beginnt. Von Konto 1 werden 20 EUR abgebucht (Konto 1: ­20, Konto 0)
2. Transaktion beginnt: Von Konto 2 werden 30 EUR abgebucht (Konto 2: ­30)
2. Transaktion fortgesetzt: Konto 1 30 EUR gutgeschrieben (Konto 1: 10 EUR)
1. Transaktion fortgesetzt: 20 EUR werden Konto 2 gutschrieben: (Konto 2: 20, da 1. Transaktion davon ausgeht, dass der Kontostand vor Transaktion ­20 ist.) 3
SOTE1­2016­12­05.notebook
December 05, 2016
wait() & notify()
Wunsch: Der Grafik­Thread wartet auf den Berechner­
Thread, bis der die Ergebnisse berechnet hat.
D.h. beide Threads müssen miteinander kommunizieren und aufeinander warten können.
wait()
notify()
Excel­Berechner­Thread
Excel­Grafik­Thread
Excel­Haupt­Thread
4
SOTE1­2016­12­05.notebook
December 05, 2016
Thread wartet, bis über Monitor Nachricht kommt
Thrad schickt über Monitor Nachricht
Wichtig:
•
Sollen zwei Threads miteinander kommunizieren, benötigen Sie einen
*gemeinsamen* Monitor (Instanz eines Objekts)
•
wait() und notify() müssen in synchronized-Blöcken stehen
5
SOTE1­2016­12­05.notebook
December 05, 2016
6
Herunterladen