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
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!