Heim > Java > javaLernprogramm > Hauptteil

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

Patricia Arquette
Freigeben: 2024-11-09 01:56:02
Original
231 Leute haben es durchsucht

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;
  }
}
Nach dem Login kopieren

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);
    }
}
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!