Wir haben auch hier die einfachere Lösungsvariante gewählt. Es ist nur ein einziges Wort an der richtigen Stelle nötig um Kollisionen beim zeichnen zu vermeiden: in FCanvas.java, Zeile 80
vorher: | public void dot(Color c, int x, int y) |
---|---|
neu: | public synchronized void dot(Color c, int x, int y) |
Mit der einfacheren Variante mussten wir wiederum nur eine einzige Datei ändern. Zudem finden wir es sinnvoller die Ursache des Fehler direkt zu beheben, als in jeder Fraktalklasse ein Flickwerk zu programmieren. Sie finden diese einfache Lösung hier:
Allerdings kann es durchaus sein, dass Sie nicht alle Quelldateien besitzen. In diesem Fall würden wir empfehlen, in der Basisklasse Fractal eine Methode setdot(Color c, int x, int y) einzuführen, die das Objekt canvas um den Aufruf von dot schützt. Dies würde auch eine kompakte Fehlerkorrektur darstellen, würden doch alle Implementationen von Fraktalklassen diese Methode setdot erben. Wir haben auch diese Lösung beigelegt. Schauen Sie sich die Änderungen, die nötig wurden in den Klassen Fractal, Mandelbrot und Julia an:
Wenn Sie unsere Lösung übernehmen wollen, vermeiden Sie, diese beiden Lösungsansätze zu mischen. Kopieren Sie die folgenden Dateien in Ihres Arbeitsverzeichnis.
FCanvas.java, Fractal.java, FractalList.java, Julia.java, Mandelbrot.java
Sie stellen eine konsistente Lösung dieses Postens dar und zwar basierend auf dem einfachen Ansatz.
Übrigens: auch bei dieser Lösung sind den eigentlichen Dateinamen drei Grossbuchstaben (SYN für Synchronisation) vorangestellt. Wenn Sie mit diesen Dateien weiterarbeiten wollen, müssen Sie nach dem Kopieren diese drei Buchstaben aus den Namen entfernen.
Kritische Abschnitte - Synchronisation in Java - Tips und Hinweise - Lösungsmöglichkeit
OOP - Werkzeuge - Referenzen - Fäden - Synchronisation - Applets - Dokumentation
Werkstatt - Bibliographie