Häufig kommt es vor, daß mehrere Threads auf den gleichen Datenbereich zugreifen bzw. ihn ändern (zum Beispiel bei Buchungssätzen). Da die Reihenfolge des Ablaufs der Threads nicht vorhersehbar ist, und sie sogar parallel laufen, können Daten in einen inkonsistenten Zustand gebracht werden.
Java löst dieses Problem unter Verwendung des Schlüsselwortes synchronized. Deklariert man eine Methode als synchronized-Methode, so ist es Threads verboten, diese Methode aufzurufen, falls diese bereits von einem anderen Thread benutzt wird. Erst nachdem dieser Thread die synchronized-Methode ausgeführt hat, darf einer der anderen Threads die Methode aufrufen. Bei der Synchronisierung ordnet ein sogenannter Monitor jedem Objekt ein zusätzliches Objekt zu und erlaubt immer nur einen bestimmten Objekt den Aufruf der synchronized-Methode.
Das folgende Applet demonstriert Ihnen ein Applet, das eine synchronized-Methode
implementiert. Es ist das vorherige Beispiel-Applet, mit der Ausnahme,
daß immer nur ein Lämpchen leuchtet.
(Quelltext)
Erfahrene C++-Programmierer werden wahrscheinlich, die beiden vorgestellten Applets zusammenbetrachtet, bemängeln, daß die Programme nicht gerade sehr objektorientiert geschrieben ist.
Besser wäre es zum Beispiel gewesen, für die Klassen Sync
und Blinken eine gemeinsame Klasse zu implementieren, die gemeinsamen Methoden
und Instanzen-Variablen enthält und danach von ihr Sync und Blinken
ableiten. In den gezeigen Beispielen haben wir aber mehrere Klasse, die
fast die gleichen Eigenschaften haben. Das heißt, von Wiederverwendbarkeit
der Klassen ist nicht zu sprechen.
Eine weitere Kritik ist, daß (im letzten Beispiel) Objekte der Klasse
Zeichen alle Methoden des Applet-Objektes aufrufen können. Dadurch
ist das Applet-Objekt beliebig "manipulierbar". In "guten"
objektorierten Programmen muß der Programmierer bestimmte Maßnahmen
treffen, um solche Mängeln zu beseitigen. Ideallerweise darf nur die
eigene Klasse mit Hilfe ihrer eigenen Methoden ihre Attribute bzw. Zustand
ändern bzw. muß immer über ihren Zustand informiert sein.
Hätten wir diesen Weg gewählt, wären die Beipiele aber für unerfahrene Programmierer wahrscheinlich schwerer zu durchschauen. Ebenso haben wir bewußt mit diesen Mängeln die Beispiele geschrieben, um erst auf die typischen Fehler von Programmierer, die zum ersten mal ein objektorientiertes Programm schreiben, weisen zu können. Auch das folgende Beispiel zeigt nur einen ersten Ansatz, ein etwas größeres Applet zu schreiben. Erst im darauf folgenden Beispiel werden wir diese Mängeln beseitigen.
|
Kapitel IAllgemeines über Java |
|
Kapitel IIJava-Applets und ihre Funktionsweise |
|
|
|
|
|||
|
Kapitel IIIInteressante Links |
|
Kapitel IVEinfürung in Java anhand konkreter Bespiele |
|
Copyright © Quoc-Thanh Lam & Marco Lauer