Hier habe ich eine Klasse mit zwei Threads, die Zugriff auf eine Liste haben. Ein Thread ersetzt die Liste regelmäßig durch eine aktualisierte Kopie und der andere Thread zeichnet den Inhalt der Liste auf den Bildschirm.
%Vor%Meine Frage ist, muss ich den Zugriff auf die DataList synchronisieren? Wie soll ich das machen? Würde das funktionieren:
%Vor% Immer wenn mehr als ein Thread auf denselben veränderlichen Zustand zugreift (nun, fast immer, es gibt einige Ausnahmen, wie wenn Sie wissen, dass der Status nicht innerhalb der Lebenszeit des anderen Threads mutieren wird), müssen Sie einige Art der Aktion. In diesem Fall mutieren Sie das Feld dataList
und Sie erwarten, dass ein anderer Thread darauf reagiert. Also musst du etwas machen. Die allgemeinste Lösung ist die Verwendung von synchronized
, und Ihr Entwurf, wie Sie das tun, ist in Ordnung.
Wenn Sie die maximale Squeeze-Leistung aus etwas herausholen wollen (was für ein GUI-Problem etwas lächerlich ist), oder wenn Sie Ihr großes Verständnis von Nebenläufigkeit demonstrieren möchten, können Sie leichtere Alternativen in Betracht ziehen, die für mehr gelten begrenzte Umstände. In diesem Fall haben Sie nur einen Schreiber und der Schreiber schreibt nur eine einzige Referenz. Für solche Fälle ist volatile
ausreichend. In dieser Art von Code würde ich persönlich bei synchronized
bleiben, weil es weniger wahrscheinlich ist, wenn Sie den Code ändern, wie vielleicht Sie einen anderen Writer-Thread oder etwas hinzufügen.
Wenn Sie die Liste nicht synchronisieren, sollten Sie die Liste volatil machen. Auf diese Weise erhält der Lese-Thread die letzte Kopie des Werts der List-Variablen.
Hier ist eine gute Erklärung.
Die offizielle Java-Dokumentation weist darauf hin, dass eine ArrayList nicht synchronisiert ist. Sie müssen es also synchronisieren.
Die Dokumentation besagt jedoch auch, dass dies nur gilt, wenn mehrere Threads auf dieselbe Liste zugreifen. Also sollte es in Ihrem Fall nicht notwendig sein, es zu synchronisieren. Aber wenn Sie 100% sicher sein wollen, können Sie Ihre Liste mit diesem einfachen Anruf synchronisieren:
%Vor%... wo "data_type" die Typenwerte sind, die Sie speichern möchten.
Tags und Links java multithreading paint thread-synchronization