19 Stimmen

Macht der unveränderbare Wrapper für Java-Sammlungen sie thread-sicher?

Ich brauche, um eine ArrayList von ArrayLists Thread sicher zu machen. Ich kann auch nicht der Client, die Änderungen an der Sammlung haben. Wird die unmodifiable Wrapper machen es Thread sicher oder brauche ich zwei Wrapper auf die Sammlung?

1voto

volley Punkte 6555

Ein unveränderliches Objekt ist per Definition thread-sicher (vorausgesetzt, niemand behält Verweise auf die ursprünglichen Sammlungen), so dass die Synchronisierung ノット notwendig.

Das Umhüllen der äußeren ArrayList mit Collections.unmodifiableList() verhindert, dass der Client den Inhalt ändern kann (und macht somit den Thread sicher), aber die inneren ArrayLists sind immer noch veränderbar.

Auch die inneren ArrayListen werden mit Collections.unmodifiableList() umhüllt verhindert, dass der Client ihren Inhalt ändert (und macht sie somit threadsicher), was Sie benötigen.

Lassen Sie uns wissen, ob diese Lösung Probleme verursacht (Overhead, Speicherverbrauch usw.); andere Lösungen könnten für Ihr Problem geeignet sein :)

EDIT: Wenn die Listen geändert werden, sind sie natürlich NICHT thread-sicher. Ich ging davon aus, dass keine weiteren Änderungen vorgenommen werden sollten.

1voto

Chris Vest Punkte 8512

Sie ist thread-sicher, wenn die unveränderbare Ansicht sicher veröffentlicht wird und das veränderbare Original nach der Veröffentlichung der unveränderbaren Ansicht niemals verändert wird (einschließlich aller rekursiv in der Sammlung enthaltenen Objekte!).

Wenn Sie das Original weiterhin ändern wollen, können Sie entweder eine defensive Kopie des Objektgraphen Ihrer Sammlung erstellen und eine unveränderbare Ansicht davon zurückgeben, oder eine inhärent thread-sichere Liste verwenden und eine unveränderbare Ansicht davon zurückgeben.

Sie kann nicht eine unmodifiableList(synchonizedList(theList)) zurückgeben, wenn Sie danach immer noch beabsichtigen, unsynchronisiert auf theList zuzugreifen; wenn der veränderbare Zustand von mehreren Threads gemeinsam genutzt wird, dann tous Threads müssen sich auf dem dieselbe Sperren, wenn sie auf diesen Zustand zugreifen.

0voto

Andreas Petersson Punkte 15962

Dies ist erforderlich, wenn:

  1. Es gibt immer noch einen Verweis auf die ursprüngliche änderbare Liste.
  2. Der Zugriff auf die Liste erfolgt möglicherweise über einen Iterator.

Wenn Sie beabsichtigen, aus der ArrayList nur nach Index zu lesen, könnten Sie davon ausgehen, dass dies thread-sicher ist.

Im Zweifelsfall sollten Sie sich für den synchronisierten Wrapper entscheiden.

0voto

Mecki Punkte 113876

Ich weiß nicht, ob ich verstanden habe, worauf Sie hinauswollen, aber ich würde sagen, dass die Antwort in den meisten Fällen "Nein" lautet.

Wenn Sie eine ArrayList von ArrayList einrichten und sowohl die äußere als auch die innere Liste nach der Erstellung nie geändert werden können (und während der Erstellung nur ein Thread Zugriff auf die innere und die äußere Liste hat), sind sie wahrscheinlich durch einen Wrapper thread-sicher (wenn sowohl die äußere als auch die innere Liste so gewickelt sind, dass eine Änderung unmöglich ist). Alle Nur-Lese-Operationen auf ArrayLists sind höchstwahrscheinlich thread-sicher. Sun bietet jedoch keine Garantie Sie müssen thread-sicher sein (auch nicht für Nur-Lese-Operationen). Auch wenn es jetzt funktioniert, könnte es in der Zukunft scheitern (wenn Sun z.B. eine interne Zwischenspeicherung von Daten für einen schnelleren Zugriff einrichtet).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X