Wie kann ich trotz der Verwendung von Synchronized eine ConcurrentModificationException erhalten?
Man geht häufig davon aus, dass die Verwendung des synchronisierten Schlüsselworts alle Parallelitätsprobleme verhindert. Es stellt jedoch nur sicher, dass jeweils ein Thread auf einen synchronisierten Codeblock zugreifen kann. Es verhindert nicht, dass Änderungen an der Sammlung wiederholt werden.
Beachten Sie den folgenden Code:
public synchronized X getAnotherX() { if (iterator.hasNext()) { X b = iterator.next(); String name = b.getInputFileName(); ... return b; } else { return null; } }
Der synchronisierte Deklarationsheader stellt nur sicher, dass die gesamte Methode jeweils von einem Thread ausgeführt wird Zeit. Es verhindert jedoch nicht, dass die Sammlung, auf die der Iterator zugreift, von anderen Threads geändert wird.
Warum tritt ConcurrentModificationException auf?
ConcurrentModificationException tritt normalerweise auf, wenn Sie Änderungen vornehmen Die Sammlung, über die innerhalb der Iterationsschleife iteriert wird. Beispielsweise verursacht der folgende Code diese Ausnahme:
Iterator iterator = collection.iterator(); while (iterator.hasNext()) { Item item = (Item) iterator.next(); if (item.satisfiesCondition()) { collection.remove(item); } }
In diesem Fall sollten Sie stattdessen die Methode iterator.remove() verwenden, um Elemente zu entfernen. Wenn Sie der Sammlung etwas hinzufügen müssen, können Sie sich nicht auf synchronisierte Methoden verlassen. Wenn Sie jedoch mit einer Liste arbeiten, können Sie den Untertyp ListIterator verwenden, der eine add()-Methode bereitstellt.
Das obige ist der detaillierte Inhalt vonWarum erhalte ich eine ConcurrentModificationException, selbst wenn ich „synchronized' verwende?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!