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?

10voto

Michael Borgwardt Punkte 334642

Es kommt darauf an. Der Wrapper verhindert nur Änderungen an der Sammlung, die er umhüllt, nicht an den Objekten in der Sammlung. Wenn Sie eine ArrayList von ArrayLists haben, müssen Sie die globale Liste sowie jede ihrer Elementlisten separat wrappen, und Sie müssen möglicherweise auch etwas für den Inhalt dieser Listen tun. Schließlich müssen Sie sicherstellen, dass die ursprünglichen Listenobjekte nicht verändert werden, da der Wrapper nur Änderungen durch die Wrapper-Referenz verhindert, nicht aber durch das ursprüngliche Objekt.

In diesem Fall brauchen Sie den synchronisierten Wrapper NICHT.

5voto

Dror Helper Punkte 29647

Zu einem verwandten Thema - ich habe mehrere Antworten gesehen, die vorschlagen, synchronisierte Sammlung zu verwenden, um Thread-Sicherheit zu erreichen. Die Verwendung einer synchronisierten Version einer Sammlung macht sie nicht "thread-sicher" - obwohl jede Operation (Einfügen, Zählen usw.) durch Mutex geschützt ist, gibt es bei der Kombination von zwei Operationen keine Garantie, dass sie atomar ausgeführt werden. Der folgende Code ist zum Beispiel nicht thread-sicher (selbst mit einer synchronisierten Warteschlange):

if(queue.Count > 0)
{
   queue.Add(...);
}

2voto

Dan Dyer Punkte 52915

Der unveränderbare Wrapper verhindert nur Änderungen an der Struktur der Liste, für die er gilt. Wenn diese Liste andere Listen enthält und Sie über Threads verfügen, die versuchen, diese verschachtelten Listen zu ändern, sind Sie nicht gegen das Risiko gleichzeitiger Änderungen geschützt.

1voto

John Gardner Punkte 22999

Wenn man sich den Quelltext von Collections ansieht, sieht es so aus, als würde Unmodifiable ノット synchronisiert werden.

static class UnmodifiableSet<E> extends UnmodifiableCollection<E>
                 implements Set<E>, Serializable;

static class UnmodifiableCollection<E> implements Collection<E>, Serializable;

die synchronisierte Klasse Wrapper haben ein Mutex-Objekt in ihnen, um die synchronisierten Teile zu tun, so sieht aus wie Sie brauchen, um beide zu verwenden, um beide zu erhalten. Oder erstellen Sie Ihr eigenes!

1voto

djpowell Punkte 377

Ich glaube, dass, weil die UnmodifiableList Wrapper speichert die ArrayList zu einem endgültigen Feld, alle Lesemethoden auf der Wrapper wird die Liste zu sehen, wie es war, wenn der Wrapper erstellt wurde, solange die Liste nicht geändert wird, nachdem der Wrapper erstellt wird, und solange die veränderbare ArrayLists innerhalb der Wrapper nicht geändert werden (die der Wrapper nicht gegen schützen kann).

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