5. Synchronisation

OOPWerkzeugeReferenzenFädenSynchronisationAppletsDokumentation


Synchronisation

Haben Sie im letzten Posten auch «falsche» Punkte in Ihrem Fraktal entdeckt? Falls nicht, dann haben Sie diesen Posten schon gelöst und können sofort zum nächsten Posten gehen!

Wie sind diese Punkte denn überhaupt entstanden? Am Grundalgorithmus kann es nicht liegen, erscheint doch das Fraktal makellos, wenn nur ein Thread rechnet. Es muss also mit dem Multithreading zusammenhängen. Solche Fehler sind typisch für Multithreading- oder Multiprocessing-Systeme. Sie treten relativ selten auf (das Fraktal ist immer noch als solches zu erkennen) und sind scheinbar zufällig. Der Ursprung solcher Fehler liegt darin, dass mehrere Threads um eine Ressource «kämpfen», die sie sich teilen müssen. In unserem Beispiel ist diese Ressource die Farbe mit der gezeichnet wird. Der Fehler liegt im folgenden Stück Code, welches wir zur Verfügung stellten (und somit sind die Autoren dieser Werkstatt als Sündenböcke entlarvt):

public void dot(Color c, int x, int y) {
  offScreenGraphic.setColor(c);              // Setzt Farbe auf dem Hintergrundbild
  offScreenGraphic.fillRect(x, size().height - y, 1, 1); // Zeichnet Punkt
  if (gp != null) {
    gp.setColor(c);                // Setzt Farbe des sichtbaren Bildes
    gp.fillRect(x, size().height - y, 1, 1);       // Zeichnet Punkt
  }
}

Sie sehen, dass das Setzen der Farbe und das Zeichnen des Punktes an einer bestimmten Position zwei verschiedene Methoden sind. (Warum man das Fraktal zweimal zeichnet, wird im Material kurz erläutert.) Hat ein Thread nun die Farbe gesetzt, und wird vom Scheduler unterbrochen bevor er den Punkt zeichnen kann, passiert folgendes: ein anderer Thread wird gelegentlich auch die Farbe setzen, diesmal aber gemäss seinen eigenen Berechnungen. Danach zeichnet er den Punkt, und später wird ihm wieder die Kontrolle entzogen. Der erste Thread fährt nun exakt dort fort, wo er unterbrochen wurde. Er zeichnet also den Punkt, ändert die Farbe aber nicht mehr!

Ziel

Wenn Sie den Posten bearbeitet haben sollten Sie:

Auftrag

Beheben Sie in Ihrem Programm die Kollisionen, die bei mehreren Threads auftreten.

Wir erwarten von Ihnen, dass mindestens eine der beiden Fraktalklassen (Mandelbrot oder Julia) korrekt funktioniert (bei mehreren Threads natürlich).

Material

Es stehen Ihnen folgende Materialien zur Verfügung:

Kritische Abschnitte
Beschreibt den Umfang des JDK 1.0.2 etwas detaillierter
Synchronisation in Java
Erklärt, wie der Compiler und der Interpreter zu bedienen sind.
Tips und Hinweise
Lesen Sie diesen Text durch bevor Sie mit der Arbeit anfangen.
Lösungsmöglichkeit
Enthält einen Lösungsvorschlag für diesen Werkstattposten.

OOP - Werkzeuge - Referenzen - Fäden - Synchronisation - Applets - Dokumentation
Werkstatt - Bibliographie