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?
Antworten
Zu viele Anzeigen?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.
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(...);
}
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!
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).
- See previous answers
- Weitere Antworten anzeigen