Wenn ich den folgenden Code ausführe, erhalte ich ConcurrentModificationException
%Vor%Warum erhalte ich die Ausnahme, obwohl ich Collections.synchronizedList verwende?
Wenn ich myCollection in
ändere %Vor%Ich bekomme diese Ausnahme nicht.
Wie unterscheidet sich ConcurrentLinkedQueue in java.util.concurrent von Collections.synchronizedList?
Eine synchronisierte Liste bietet keine neue Implementierung von Iterator
. Es wird die Implementierung der synchronisierten -Liste verwenden. Das Implementierung von iterator()
ist:
Von ArrayList
:
Die von den Iterator- und listIterator-Methoden dieser Klasse zurückgegebenen Iteratoren sind fail-fast : wenn die Liste zu irgendeinem Zeitpunkt nach der Erstellung des Iterators strukturell geändert wird, außer durch den eigenen iterator oder remove add Methoden, der Iterator wird ein
werfenConcurrentModificationException
Von ConcurrentLinkedQueue#iterator
:
Gibt einen Iterator über die Elemente in dieser Warteschlange in der richtigen Reihenfolge zurück. Der zurückgegebene Iterator ist ein "schwach konsistenter" Iterator, der niemals
ConcurrentModificationException
liefert und garantiert, dass Elemente durchlaufen werden, wie sie bei der Konstruktion des Iterators existierten, und möglicherweise (aber nicht garantiert) alle wiedergibt Änderungen nach dem Bau.
Die von den beiden Sammlungen zurückgegebenen Iteratoren sind von Entwurf anders .
Wie unterscheidet sich ConcurrentLinkedQueue in java.util.concurrent von Collections.synchronizedList?
Sie haben unterschiedliche Implementierungen und können daher auswählen, ob ConcurrentModificationException ausgelöst werden soll oder ob die von Ihnen beschriebene Situation behandelt werden soll. Offensichtlich behandelt CLQ elegant, und ArrayList wird von Collections.synchronizedList umschlossen (meine Vermutung ist das Verhalten ist ArrayList's, nicht die des Wrappers) nicht.
Wie @unbeli sagt, entferne den Iterator und nicht die Sammlung während der Iteration.
Tags und Links java collections