Heim  >  Artikel  >  Java  >  Warum tritt trotz der Verwendung von „synchronized“ in Java eine „ConcurrentModificationException“ auf?

Warum tritt trotz der Verwendung von „synchronized“ in Java eine „ConcurrentModificationException“ auf?

Susan Sarandon
Susan SarandonOriginal
2024-11-07 01:32:03920Durchsuche

Why Does a `ConcurrentModificationException` Occur Despite Using `synchronized` in Java?

ConcurrentModificationException trotz Synchronisierung

In diesem Codeausschnitt:

public synchronized X getAnotherX() {
  if (iterator.hasNext()) {
    X b = iterator.next();
    String name = b.getInputFileName();
    ...
    return b;
  } else {
    return null;
  }
}

eine ConcurrentModificationException wird trotz der Verwendung von geworfen synchronisiertes Schlüsselwort. Diese Ausnahme entsteht normalerweise nicht durch Multithreading-Probleme, sondern durch Änderungen an der zugrunde liegenden Sammlung während der Iteration.

In diesem speziellen Beispiel tritt der Fehler auf, wenn mit iterator.hasNext() durch die Sammlung iteriert wird und dies versucht wird Greifen Sie mit iterator.next() auf ein Element zu. Wenn die zugrunde liegende Sammlung während dieser Iteration geändert wird, beispielsweise durch das Hinzufügen oder Entfernen von Elementen, kann dies die ConcurrentModificationException verursachen.

Die Lösung besteht darin, Sammlungsänderungen während der Iteration zu vermeiden. Dies kann erreicht werden, indem eine Kopie der Sammlung erstellt wird oder indem diese Änderungen innerhalb der Iterationsschleife explizit überprüft und verarbeitet werden. Wenn der Sammlungstyp außerdem einen ListIterator unterstützt, stellt diese Schnittstelle zusätzliche Methoden zum Verwalten von Einfügungen und Entfernungen während der Iteration bereit.

Das obige ist der detaillierte Inhalt vonWarum tritt trotz der Verwendung von „synchronized“ in Java eine „ConcurrentModificationException“ auf?. 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