Heim >Java >javaLernprogramm >So lösen Sie die Ausnahme der gleichzeitigen Java-Änderung (ConcurrentModificationException)

So lösen Sie die Ausnahme der gleichzeitigen Java-Änderung (ConcurrentModificationException)

WBOY
WBOYOriginal
2023-08-19 10:25:441938Durchsuche

So lösen Sie die Ausnahme der gleichzeitigen Java-Änderung (ConcurrentModificationException)

So lösen Sie die Java-Ausnahme für gleichzeitige Änderungen (ConcurrentModificationException)

Wenn bei der Java-Programmierung mehrere Threads gleichzeitig ein Sammlungsklassenobjekt ändern, kann es leicht zu einer „ConcurrentModificationException“-Ausnahme kommen. Dieser Artikel beschreibt die Ursache der Ausnahme und bietet verschiedene Lösungen und Codebeispiele.

1. Ausnahmeursache

1.1 Sammlungsklassenstruktur
ConcurrentModificationException-Ausnahme tritt normalerweise in Iterator-basierten Sammlungsklassen wie ArrayList, HashMap usw. auf. Sie verwenden intern eine modCount-Variable, um die Häufigkeit aufzuzeichnen, mit der die Sammlung geändert wurde.

1.2 Gleichzeitige Änderung
Wenn ein Thread eine iterative Operation ausführt, fügt ein anderer Thread die Sammlung hinzu, löscht oder ändert sie, wodurch der Wert von modCount geändert wird, wodurch der Iterator denkt, dass die Sammlung geändert wurde, und dann eine ConcurrentModificationException-Ausnahme auslöst .

2. Lösung

2.1 Verwenden Sie die Remove-Methode des Iterators.
Der Iterator in der Java-Sammlungsklasse stellt die Remove-Methode bereit, mit der das aktuell iterierte Element sicher aus der Sammlung entfernt werden kann.

List<String> list = new ArrayList<>();
Iterator<String> iterator = list.iterator();

while (iterator.hasNext()) {
    String element = iterator.next();
    if (condition) {
        iterator.remove();
    }
}

2.2 Verwendung gleichzeitiger Sammlungsklassen
Das Java-Parallelitätspaket (java.util.concurrent) stellt eine Reihe threadsicherer Sammlungsklassen bereit, die alle unterschiedliche Parallelitätsmechanismen verwenden, um das Problem der gleichzeitigen Änderung zu lösen.
Verwenden Sie beispielsweise ConcurrentHashMap anstelle von HashMap:

import java.util.concurrent.ConcurrentHashMap;

ConcurrentHashMap<String, String> map = new ConcurrentHashMap<>();
map.put("key1", "value1");
map.put("key2", "value2");

for (Map.Entry<String, String> entry : map.entrySet()) {
    if (condition) {
        map.remove(entry.getKey());
    }
}

2.3 Verwenden Sie den Synchronisierungsmechanismus.
Verwenden Sie das synchronisierte Schlüsselwort, um die Sammlung zu synchronisieren, um sicherzustellen, dass nur ein Thread gleichzeitig auf die Sammlung zugreifen kann, wodurch gleichzeitige Änderungsausnahmen vermieden werden.

List<String> list = new ArrayList<>();

synchronized (list) {
    for (String element : list) {
        if (condition) {
            list.remove(element);
        }
    }
}

2.4 Verwendung von CopyOnWriteArrayList
CopyOnWriteArrayList ist eine Thread-sichere Sammlungsklasse, die während Schreibvorgängen (Hinzufügen, Löschen, Ändern) eine neue Sammlungskopie erstellt und so gleichzeitige Änderungsausnahmen vermeidet.

import java.util.concurrent.CopyOnWriteArrayList;

CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>();
list.add("item1");
list.add("item2");

for (String element : list) {
    if (condition) {
        list.remove(element);
    }
}

3. Zusammenfassung

Java Concurrent Modification Exception (ConcurrentModificationException) wird dadurch verursacht, dass mehrere Threads gleichzeitig Sammlungsklassenobjekte ändern. Um dieses Problem zu lösen, können Sie die Remove-Methode des Iterators, die gleichzeitige Sammlungsklasse, den Synchronisationsmechanismus oder CopyOnWriteArrayList und andere Methoden verwenden. Wählen Sie entsprechend der tatsächlichen Situation eine geeignete Methode, um gleichzeitige Änderungsausnahmen zu beheben und die Stabilität und Zuverlässigkeit des Programms sicherzustellen.

4. Referenzen

  1. „So lösen Sie ConcurrentModificationException in Java“, Baeldung, https://www.baeldung.com/java-concurrentmodificationException
  2. „ConcurrentModificationException in Java – Wie vermeide ich es?“, JournalDev, https: //www.journaldev.com/378/how-to-avoid-concurrentmodificationException-in-java

Das obige ist der detaillierte Inhalt vonSo lösen Sie die Ausnahme der gleichzeitigen Java-Änderung (ConcurrentModificationException). 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