Wie kann ich eine thread safe / immutable Collection in Java zurückgeben?

7

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!

    
Ziyao Wei 12.07.2011, 01:45
quelle

4 Antworten

13

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.

    
Ray 12.07.2011, 01:48
quelle
5

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:

%Vor%     
duffymo 12.07.2011 01:47
quelle
2
%Vor%

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.

     

......

java 8 java.util. Sammlungen javadoc

    
Awan Biru 02.03.2016 08:07
quelle
0

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

    
Rob Moffat 06.11.2015 14:06
quelle