Info B VL 16: Monitore und Semaphoren Objektorientiere Programmierung in Java 2003 Ute Schmid (Vorlesung) Elmar Ludwig (Übung) FB Mathematik/Informatik, Universität Osnabrück 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 Info B VL 16: Monitore und Semaphoren – p.318 Wdh: Kommunikationsformen Produzent Auftraggeber 1 Konsument 2 Auftragnehmer 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 Info B VL 16: Monitore und Semaphoren – p.320 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) vorhanden bereit laufend wartend wenn Zutritt zum Monitor fertig wait() notify() eines anderen Threads blockiert Monitor durch anderen Thread besetzt Info B VL 16: Monitore und Semaphoren – p.322 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ähler 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 Info B VL 16: Monitore und Semaphoren – p.324 Synchronisation mit Semaphoren (1) Einseitig Semaphore s = new Semaphore(0); void process1 () { // ... s.V(); // Ereignis signalisieren // ... } void process2 () { // ... 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 () { // ... s.P(); // ... kritischer Abschnitt s.V(); // ... } void process2 () { // ... s.P(); // ... kritischer Abschnitt s.V(); // ... } Beispielcode: ProdConsDemo.java Info B VL 16: Monitore und Semaphoren – p.326