Wie, um wieder eine thread-sichere/immutable Collection in Java?
In das Projekt, das ich bin-Kodierung, die ich brauche, um wieder eine thread-sichere und unveränderliche Ansicht von einer Funktion. Allerdings bin ich nicht sicher. Da synchronizedList
und unmodifiableList
nur zurück, Blick auf eine Liste, ich weiß nicht, ob
Collections.synchronizedList(Collections.unmodifiableList(this.data));
würde den trick tun.
Könnte mir jemand sagen ob dies korrekt ist, und falls nicht, gibt es irgendwelche Situationen, dies würde wahrscheinlich zu scheitern?
Vielen Dank für alle inputs!
InformationsquelleAutor Ziyao Wei | 2011-07-12
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich finde, dass dies eine echte Lücke in der JDK. Zum Glück, ein team, über eine Google-led von Java Collections designer Joshua Bloch, haben eine Bibliothek enthält wirklich unveränderlich Sammlungen.
ImmutableList in allem ist die Umsetzung, die Sie suchen. Hier ist eine schnelle Skizze einige der Eigenschaften der Guave ist ImmutableCollections.
Ich denke unveränderbar ist ausreichend. Sie können es nicht zu schreiben, das ist, was verursacht Probleme für multi-threaded-Zugriff. Es ist read-only, so dass der zusätzliche Schritt der Synchronisierung scheint überflüssig für mich.
Beste heraus zu überprüfen den Quellcode, wenn es sind Fragen wie diese. Sieht aus wie es gibt ein
UnmodifiableList
:Tun, als wird es wieder ein Blick. Jede änderung versucht auf diese Ansicht wird im Ergebnis
UnsupportedOperationException
geworfen. Unten sind ein Auszug vonCollections#unmodifiableList
Dokumentation.java 8 java.util.Sammlungen javadoc
Diese Ansichten nicht zurückkehren, Sie wirklich thread-safe collections. Es besteht immer die Möglichkeit, dass jemand " ändern Sie entweder die backing-Sammlung, oder die Elemente innerhalb der Sammlung.
Um dieses Problem zu lösen, müssen Sie die unveränderliche Sammlungen und unveränderliche Elemente. Dann, thread-Sicherheit als Folge passiert.
Clojure enthält unveränderliche (oder persistent) Sammlungen.
Setzen Sie einfach, hinzufügen oder entfernen von neuen Elementen gibt es eine neue Kollektion, die im Allgemeinen hat Wiederverwendung großer Teile der alten Sammlung durch geschickten Einsatz von Trie-Typ Datenstrukturen.
Auf Ihre eigenen, diese sind eine schlechte Passform für die Verwendung in geraden Java.
Pure4j ist ein Versuch, auf diesen port (und die unveränderliche/value based Stil befürwortet, Clojure), um die Java-Sprache. Es könnte sein was Sie suchen.
Disclaimer: ich bin der Entwickler von Pure4J