Ich habe eine allgemeine Frage bezüglich der synchronisierten Liste.
Sagen wir, dass ich im Konstruktor eine Liste
und ich habe eine Methode fügt ein Objekt zur Liste hinzu.
%Vor%Es gibt einen weiteren Thread, der alle paar Sekunden prüft, ob es ein paar Zeilen gibt, ihn in eine Datei ablegen und alle löschen.
Sagen wir nun, ich wiederhole jede Zeile und speichere sie in der db. Nach jeder Iteration lösche ich die Liste.
Wie hilft mir die Multithread-Unterstützung?
Ich könnte ein Element zur Liste hinzufügen, bevor die clear () im anderen Thread auftritt.
Es sei denn, ich verwalte das Schloss selbst (was ich nicht wirklich brauche eine synchronisierte Liste dafür) es selbst.
Die von Collections
zurückgegebene synchronisierte Liste wird in Ihrem Fall nicht helfen. Es ist nur gut, wenn Sie den seriellen Zugriff auf einzelne Methodenaufrufe garantieren müssen. Wenn Sie eine größere Anzahl von Operationen synchronisieren müssen, müssen Sie diesen Code manuell in einen synchronized
-Block umbrechen. Das Javadoc gibt an:
Es ist zwingend erforderlich, dass der Benutzer die zurückgegebene Liste beim Iterieren manuell synchronisiert.
Wenn Ihre Liste an anderer Stelle verwendet wird, können Sie sie zumindest vor einzelnen Methodenaufrufen schützen, die ansonsten nicht threadsicher wären. Wenn Sie die Liste jedoch vollständig verwalten, können Sie einfach einen synchronized
-Block zu Ihrer add
-Methode hinzufügen und die gleiche Sperre verwenden, die Sie beim Iterieren verwenden.
synchronizedList
garantiert nur, dass jeder Methodenaufruf auf der Liste synchronisiert ist. Wenn Sie mehrere Vorgänge synchron ausführen müssen, müssen Sie die Synchronisierung selbst durchführen.
Übrigens, das wird explizit in javadoc für Collections.synchronizedList :
%Vor%Es ist zwingend erforderlich, dass der Benutzer Synchronisieren Sie manuell auf dem zurückgegebenen Liste beim Iterieren:
synchronisierte Liste bedeutet, dass alle Operationen auf dieser Liste garantiert atomar sind. Das von Ihnen beschriebene Szenario erfordert eine Sperrung außerhalb der Liste. Betrachten Sie Semaphore oder machen Sie synchronized
block, um Monitore zu implementieren. Sehen Sie sich java.util.concurrent an.
Tags und Links java synchronized