Hochschule Reutlingen - Reutlingen University Fakultät Informatik Studiengang Medien- und Kommunikationsinformatik akkreditiert von der ASIIN Prof. Dr. Karlheinz Hug Informatik 3 Ü3 Übungsblatt: Nebenläufigkeit Aufgabe 3 Ü3.1 Synchronisationskonzepte Aufgabe Ü3.1 Java: Ausnahmebehandlung bei Synchronisation In Java können Threads in der Synchronisationsmethode wait auf ein notify eines anderen Threads warten. Ein Thread kann einen wartenden Thread unterbrechen (z.B. wenn ein Benutzer interaktiv den Abbruch eines Threads verlangt), wodurch im wartenden Thread eine InterruptedException ausgelöst wird, die dieser entweder an die aufrufende Methode weiterreicht oder beim wait-Aufruf behandelt. wait-Aufrufe können daher in einer try-catch-Struktur stehen und gehören, da die Wartebedingung nach dem Warten meist nicht sicher falsch ist, meist in eine Schleife. Programm Ü3.1 Java: Idiom zum Warten in synchronisierter Methode while (needToWait) { try { wait(); } catch(InterruptedException e) { // what to do here? } } Doug Lea schlägt in seinem Buch Concurrent Programming in Java (1997) als Optionen für die Ausnahmebehandlung vor: (1) (2) (3) (4) (5) (6) Ignorieren, also nichts tun. (Bloch empfiehlt in Effective Java Programming Language Guide (2001), Ausnahmen nie zu ignorieren.) Aktuellen Thread terminieren durch einen stop-Aufruf (der seit JDK 1.2 (1999) als unsicher verworfen (deprecated) ist und nicht mehr verwendet werden soll). Die Methode sofort mit return verlassen. Eine neue Ausnahme werfen (throw new InterruptedException). Aufräumen und das Hauptprogramm neu starten. Den Benutzer interaktiv fragen, was zu tun sei. Diskutieren Sie Konsequenzen, Stärken und Schwächen dieser Vorschläge und geben Sie eine Programmierempfehlung! Aufgabe Ü3.2 Semaphorimplementationen Aus der Vorlesung kennen Sie eine Semaphorimplementation in Java; Programm Ü3.2 zeigt eine andere. (1) (2) (3) (4) (5) Worin unterscheiden sich die beiden Semaphorimplementationen? Warum sind beide Implementationen äquivalent? Geben Sie eine Invariante für count in Programm Ü3.2 an! Welche Information geht in Programm Ü3.2 gegenüber der anderen Implementation verloren? Warum ist Programm Ü3.2 weniger effizient als die andere Implementation? © Karlheinz Hug, Hochschule Reutlingen, 28. November 2008 I3 - Ü3 - Seite 1 von 2 Informatik 3 - Ü3 - 2 Programm Ü3.2 Java: Semaphor Ü3 Übungsblatt: Nebenläufigkeit public class Semaphore { private int count; public Semaphore (int initCount) { assert initCount >= 0 : "Precondition: Initial value nonnegative"; count = initCount; } public synchronized void await () { while (count == 0) { try { wait(); } catch (InterruptedException e) { ... } } count--; } public synchronized void signalize () { count++; notify(); } } © Karlheinz Hug, Hochschule Reutlingen, Fak. Informatik, mki-B 28.11.08