Java: ConcurrentModificationException beim Iterieren der Liste

8

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?

    
Vinoth Kumar C M 06.07.2011, 12:53
quelle

3 Antworten

13

Eine synchronisierte Liste bietet keine neue Implementierung von Iterator . Es wird die Implementierung der synchronisierten -Liste verwenden. Das Implementierung von iterator() ist:

%Vor%

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 ConcurrentModificationException

werfen

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 .

    
Andreas_D 06.07.2011, 13:02
quelle
7

tu das nicht

%Vor%

tue

%Vor%

Es ist keine Synchronisation oder gleichzeitige Sammlung erforderlich.

    
unbeli 06.07.2011 12:54
quelle
2
  

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.

    
Jason S 06.07.2011 13:01
quelle

Tags und Links