Info B VL 16: Monitore und Semaphoren
Objektorientiere Programmierung in Java 2003
Ute Schmid (Vorlesung) Elmar Ludwig ( ¨Ubung)
FB Mathematik/Informatik, Universit¨at Osnabr¨uck
Info B VL 16: Monitore und Semaphoren – p.317
Wdh: Threads
können im Prinzip parallel ausgeführt werden
Vorteil: mehrere Dinge können (quasi) gleichzeitig ausgeführt werden
Beispiel: Annahme von Benutzereingaben und gleichzeitige Erledigung von Aufgaben
in Java: Erzeugung von Thread Objekten
Wenn Threads auf gemeinsamen Daten arbeiten können Probleme entstehen
Synchronisation
Wdh: Kommunikationsformen
Produzent
Konsument
Auftraggeber
Auftragnehmer
1 2
Produzent kann bereits “im Voraus” produzieren Server kann viele Clients bedienen
Info B VL 16: Monitore und Semaphoren – p.319
Wdh: Konflikte
Wenn mehrere Threads auf dieselben Daten zugreifen müssen die entsprechenden Anweisungsblöcke
synchronisiert werden
Regelung des Zugriffs durch Monitor-Objekte!
Einseitige Synchronisation bei kausaler Abhängigkeit (Konsument/Produzent): Schreib-/Lese-Konflikte
Zweiseitige Synchronisation bei wechselseitiger Abhängigkeit: Schreib-/Schreib- und
Schreib-/Lese-Konflikte
Illustration
Beispielprogramm: ConsumerProducer.java
Problem: Ein Produzent kann produzierte Daten eines anderen Produzenten überschreiben, bevor der
Konsument die Daten abgeholt hat
Problem: Produzent kann im Schreiben von Konsument unterbrochen werden, der dannn unvollständige Werte abholt
Lösung?
Info B VL 16: Monitore und Semaphoren – p.321
Zustände von Threads
(mit Monitor Objekten)
bereit laufend
vorhanden
blockiert
wait()
fertig
wartend
Monitor durch anderen Thread besetzt notify()
Threads zum Monitor
wenn Zutritt
eines anderen
Semaphoren (1)
Von Dijkstra zur Synchronisation nebenläufiger Prozesse eingeführt.
Begriff aus der Seefahrt: Optisches Signal zum
Passeeren/passer (Passieren) und Vrijgeven/verlaat (Freigeben).
Idee: Prozess wird im Synchronisationsfall blockiert und in Warteschlange eingeordnet.
Die Warteschlange muss in Java nicht explizit definiert werden. Sie existiert implizit als Menge der blockierten Prozesse. Bei der Realisation durch Monitor wird
jedoch durch notify() wird ein Prozess aktiviert (nicht unbedingt der, der am längsten wartet).
Info B VL 16: Monitore und Semaphoren – p.323
Semaphoren (2)
Semaphoren sind abstrakte Datentypen:
Objekte bestehen aus Z¨ahler und Warteschlange.
Operation P: Zähler wird um eins erniedrigt. Wenn
negativer Wert, dann ist Prozess blockiert. (Warten auf das Eintreten einer Bedingung)
Operation V: Zähler wird um eins erhöht.
(Signalisieren des Eintretens einer Bedingung).
Klasse: Semaphore.java
Synchronisation mit Semaphoren (1)
Einseitig
Semaphore s = new Semaphore(0);
void process1 () { void process2 () {
// ... // ...
s.V(); // Ereignis signalisieren s.P(); // Ereignis abwarten
// ... // ...
} }
Info B VL 16: Monitore und Semaphoren – p.325
Synchronisation mit Semaphoren (2)
Wechselseitig (Kritischer Abschnitt)
Semaphore s = new Semaphore(1);
void process1 () { void process2 () {
// ... // ...
s.P(); s.P();
// ... kritischer Abschnitt // ... kritischer Abschnitt
s.V(); s.V();
// ... // ...
} }
Beispielcode: ProdConsDemo.java