unmodifiable

___ answer6658687 ___

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 %code% zurückgibt:

%Vor%     
___ qstnhdr ___ Wie kann ich eine thread safe / immutable Collection in Java zurückgeben? ___ answer35741613 ___
%Vor%

wird tun, da es eine Ansicht zurückgibt. Jeder Versuch einer Änderung führt zu %code% .

  

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

    
___ tag123java ___ Java (nicht zu verwechseln mit JavaScript oder JScript oder JS) ist eine universelle objektorientierte Programmiersprache, die für die Verwendung in Verbindung mit der Java Virtual Machine (JVM) entwickelt wurde. "Java-Plattform" ist der Name für ein Computersystem, auf dem Tools zum Entwickeln und Ausführen von Java-Programmen installiert sind. Verwenden Sie dieses Tag für Fragen, die sich auf die Java-Programmiersprache oder Java-Plattform-Tools beziehen. ___ answer6658694 ___

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.

    
___ tag123list ___ Liste kann sich beziehen auf: eine verkettete Liste (eine geordnete Menge von Knoten, die jeweils auf ihren Nachfolger verweisen) oder eine Form eines dynamischen Arrays. Um nicht für HTML-Listen verwendet zu werden, verwenden Sie stattdessen [html-lists]. ___ answer33568615 ___

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

    
___ tag123threadsafety ___ Ein Codeteil ist Thread-sicher, wenn er Datenstrukturen nur so manipuliert, dass der Code durch mehrere Threads konsistent ausgeführt werden kann. Ein Code kann threadsicher, bedingt sicher (gegenseitiger Ausschluss erforderlich) oder unsicher (kann nur von einem Thread sicher verwendet werden). ___ tag123unmodiable ___ hilf uns dieses Wiki zu bearbeiten ___ tag123synchronized ___ Ein Block oder eine Methode wird als "synchronisiert" bezeichnet, wenn der Eintrag durch das synchronisierte Java-Schlüsselwort gesteuert wird. Dies führt dazu, dass der Zugriff darauf jeweils auf einen einzelnen Thread beschränkt ist: Wenn gleichzeitige Zugriffe auftreten, werden sie in einer nicht spezifizierten Reihenfolge sequenziell ausgeführt. ___ qstntxt ___

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 %code% und %code% nur Ansichten einer Liste zurückgeben, weiß ich nicht ob

%code%

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!

    
___
2
Antworten

ConcurrentModificationException in nicht änderbarer Sammlung

Ich habe diesen Code unten und erhalte eine ConcurrentModificationException, indem ich die folgende Zeile ausfühle: %Vor% der Code: %Vor% Der Stapel ist: %Vor% Genau auf jeder Linie: %Vor% Ich sehe nicht, warum dieser Fehler auft...
01.11.2013, 11:59
4
Antworten

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

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...
12.07.2011, 01:45