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