In dem Projekt, das ich schreibe, muss ich eine Thread-sichere und unveränderliche Ansicht von einer Funktion zurückgeben. Ich bin mir jedoch nicht sicher. Da synchronizedList
und unmodifiableList
nur Ansichten einer Liste zurückgeben, weiß ich nicht ob
Collections.synchronizedList(Collections.unmodifiableList(this.data));
würde den Trick machen.
Kann mir jemand sagen, ob das stimmt, und falls nicht, gibt es Situationen, in denen dies wahrscheinlich scheitern würde?
Danke für etwaige Eingaben!
Ich finde das eine echte Lücke im JDK. Glücklicherweise hat ein Team über Google, angeführt von Java Collections Designer Joshua Bloch , ein Library , die wirklich unveränderbare Sammlungen enthält.
ImmutableList ist insbesondere die Implementierung, die Sie durchführen Ich suche nach. Hier ist eine kurze Skizze einiger Funktionen von Guavas ImmutableCollections.
Ich denke, unveränderbar ist ausreichend. Sie können nicht darauf schreiben, was Probleme beim Multithread-Zugriff verursacht. Es ist schreibgeschützt, daher erscheint mir der zusätzliche Schritt der Synchronisierung unnötig.
Am besten, den Quellcode zu überprüfen, wenn es solche Fragen gibt. Sieht so aus, als ob es ein UnmodifiableList
zurückgibt:
wird tun, da es eine Ansicht zurückgibt. Jeder Versuch einer Änderung führt zu UnsupportedOperationException
.
Gibt eine nicht änderbare Ansicht der angegebenen Liste zurück. Mit dieser Methode können Module Benutzern einen schreibgeschützten Zugriff auf interne Listen ermöglichen. Abfrageoperationen für die zurückgegebene Liste werden in die angegebene Liste "gelesen" und versuchen, die zurückgegebene Liste zu ändern, entweder direkt oder über ihren Iterator, was zu einer UnsupportedOperationException führt.
......
Diese Ansichten geben Ihnen keine wirklich thread-sicheren Sammlungen zurück. Es besteht immer die Möglichkeit, dass jemand entweder die Sicherungskopie oder die Elemente in der Sammlung ändert.
Um dies zu lösen, müssen Sie unveränderliche Sammlungen und unveränderbare Elemente verwenden. Dann passiert Thread-Sicherheit als Ergebnis.
Clojure enthält solche unveränderlichen (oder dauerhaften) Sammlungen .
Vereinfacht gesagt fügt das Hinzufügen oder Entfernen neuer Elemente eine neue Sammlung zurück, die im Allgemeinen große Teile der alten Sammlung durch geschickte Verwendung von Datenstrukturen vom Typ Trie wiederverwenden
Allein eignen sich diese nicht für die Verwendung in reinem Java.
Pure4j ist ein Versuch, diese (und den von Clojure propagierten unveränderlichen / wertbasierten Stil) in die Java-Sprache zu portieren. Es könnte sein, was Sie suchen.
Haftungsausschluss: Ich bin der Entwickler von Pure4J
Tags und Links java thread-safety list synchronized unmodifiable