java.util.ConcurrentModificationException

ConcurrentModificationException wird ausgelöst, wenn zwei Threads dasselbe Element gleichzeitig aktualisieren. Dieses Problem tritt häufig in der Multithread-Umgebung auf. Dies kann jedoch auch in einer Single-Thread-Umgebung auftreten, in der dieselbe Anwendung mehrere Threads ausführt, die dasselbe Objekt aktualisieren.

Schauen Sie sich dieses Beispiel an, das eine ConcurrentModificationException auslöst, während der Wert „drei“ aktualisiert wird.

package javabeat.net.core;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
/**
 * ConcurrentModificationException Example
 * @author krishna
 *
 */
public class ConcurrentModificationExceptionExample {
	public static void main(String args()){
        List<String> myNumbersList = new ArrayList<String>();
        myNumbersList.add("one");
        myNumbersList.add("two");
        myNumbersList.add("three");
        myNumbersList.add("four");
        myNumbersList.add("five");
        Iterator<String> numIterator = myNumbersList.iterator();
        while(numIterator.hasNext()){
            String value = numIterator.next();
            System.out.println("Value:"+value);
            if(value.equals("three")) myNumbersList.remove(value);
        }

        Map<String,String> numMap = new HashMap<String,String>();
        numMap.put("one", "one");
        numMap.put("two", "two");
        numMap.put("three", "three");

        Iterator<String> keyIterator = numMap.keySet().iterator();
        while(keyIterator.hasNext()){
            String key = keyIterator.next();
            System.out.println("Map Value:"+numMap.get(key));
            if(key.equals("two")){
                numMap.put("one","four");
                //numMap.put("four", "four");
            }
        }

    }
}

Ausgabe

Value:one
Value:two
Value:three
Exception in thread "main" java.util.ConcurrentModificationException
	at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:782)
	at java.util.ArrayList$Itr.next(ArrayList.java:754)
	at javabeat.net.core.ConcurrentModificationExceptionExample.main(ConcurrentModificationExceptionExample.java:23)

Wenn Sie sich den obigen Code ansehen, wird die Ausnahme beim Aufruf von iterator.next() ausgelöst. Dadurch wird überprüft, ob das Objekt geändert wurde, und intern checkForComodification() aufgerufen, um alle anderen vorgenommenen Änderungen anzuzeigen. Damit dieses Programm funktioniert, entfernen Sie die kommentierte Zeile und führen Sie das Programm aus. Es funktioniert und druckt die vollständige Ausgabe.

Da wir den vorhandenen Schlüsselwert in der NumMap aktualisieren, wird seine Größe nicht geändert und wir erhalten keine ConcurrentModificationException. Ich hoffe, dieses Beispiel hilft Ihnen, die ConcurrentModificationException zu verstehen.

Kommentar verfassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Nach oben scrollen