Heim  >  Artikel  >  Java  >  Warum erhalte ich eine ConcurrentModificationException, selbst wenn ich „synchronized' verwende?

Warum erhalte ich eine ConcurrentModificationException, selbst wenn ich „synchronized' verwende?

Patricia Arquette
Patricia ArquetteOriginal
2024-11-09 01:56:02264Durchsuche

Why Do I Get ConcurrentModificationException Even When Using `synchronized`?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn