Heim  >  Artikel  >  Java  >  Wie gehe ich mit ConcurrentModificationException in Java um?

Wie gehe ich mit ConcurrentModificationException in Java um?

王林
王林Original
2023-06-25 08:31:431653Durchsuche

Wie gehe ich mit ConcurrentModificationException in Java um?

Bei der Java-Programmierung ist ConcurrentModificationException eine sehr häufige Ausnahme. Diese Ausnahme tritt häufig auf, wenn wir einen Iterator (Iterator) oder eine erweiterte for-Schleife (foreach) verwenden, um eine Schleife durch eine Sammlung zu durchlaufen. In diesem Artikel werden die Ursache und Lösung dieser Ausnahme vorgestellt.

  1. Ausnahmeursache

Wenn wir einen Iterator zum Durchlaufen einer Sammlung verwenden und die Elemente in der Sammlung während des Durchquerungsprozesses geändert (hinzugefügt, gelöscht usw.) werden, wird eine ConcurrentModificationException-Ausnahme ausgelöst. Der Grund für diese Ausnahme ist, dass beim Aufruf der next()-Methode von Iterator verglichen wird, ob der aktuelle modCount gleich dem erwartetenModCount ist. Wenn er nicht gleich ist, bedeutet dies, dass sich die Sammlung während des Iterationsprozesses geändert hat Wenn wir dem Sammlungselement etwas hinzufügen oder daraus löschen, ändert sich der Wert von modCount, aber der Wert von erwartetModCount ändert sich nicht, was dazu führt, dass die beiden ungleich sind und eine ConcurrentModificationException-Ausnahme ausgelöst wird.

  1. Lösung

Um das Auftreten einer ConcurrentModificationException zu vermeiden, müssen wir beim Durchlaufen der Sammlung das Ändern der Sammlungselemente vermeiden. Im Allgemeinen gibt es drei Lösungen:

(1) Verwenden Sie zum Durchlaufen eine gewöhnliche for-Schleife

Die Verwendung einer normalen for-Schleife zum Durchlaufen ist eine praktikable Lösung, da wir die Elemente in der Sammlung über Indizes bearbeiten können, anstatt Iteratoren zu verwenden. Diese Methode ist jedoch umständlicher in der Anwendung und erfordert mehr Code.

Beispielcode:

List<String> list = new ArrayList<>();
for(int i = 0; i < list.size(); i++) {
    String str = list.get(i);
    // 对str进行操作
}

(2) Verwenden Sie die Remove-Methode von Iterator

Wenn wir beim Durchlaufen der Sammlung Elemente ändern müssen, können wir den Löschvorgang mit der Remove-Methode von Iterator durchführen. Diese Methode kann verwendet werden, um das vom letzten Aufruf der Methode next() zurückgegebene Element zu löschen, ohne eine ConcurrentModificationException auszulösen.

Beispielcode:

List<String> list = new ArrayList<>();
Iterator<String> it = list.iterator();
while(it.hasNext()) {
    String str = it.next();
    if(str.equals("hello")) {
        it.remove();
    }
}

(3) Die Verwendung von CopyOnWriteArrayList

CopyOnWriteArrayList ist eine Thread-sichere Sammlung, die sicherstellt, dass das Hinzufügen oder Löschen von Elementen zur Sammlung keine Auswirkungen auf den laufenden Thread hat . Wenn sich ein Element ändert, erstellt CopyOnWriteArrayList eine neue Kopie der Daten und bearbeitet diese dann. Daher eignet sich CopyOnWriteArrayList für Szenarien, in denen mehr gelesen und weniger geschrieben wird.

Beispielcode:

List<String> list = new CopyOnWriteArrayList<>();
Iterator<String> it = list.iterator();
while(it.hasNext()) {
    String str = it.next();
    if(str.equals("hello")) {
        list.remove(str);
    }
}

Die oben genannten sind die gängigen Methoden, die wir verwenden, um ConcurrentModificationException-Ausnahmen zu vermeiden. Bei der tatsächlichen Programmierung müssen wir Methoden basierend auf der tatsächlichen Situation auswählen, um die Robustheit und Effizienz des Programms sicherzustellen.

Das obige ist der detaillierte Inhalt vonWie gehe ich mit ConcurrentModificationException in Java um?. 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