Was ist ConcurrentModificationException in Java?

„Die ConcurrentModificationException tritt auf, wenn eine Ressource geändert wird, ohne über die Änderungsrechte zu verfügen.“
Mit anderen Worten: Die Java ConcurrentModificationException (wie der Name schon sagt) tritt aufgrund des Parallelitätsproblems auf. Es wird davon ausgegangen, dass Sie über Vorkenntnisse in Threads und Multithreading verfügen , bevor Sie fortfahren. Einige Klassen in Java, wie z. B. Collection-Klassen, erlauben einem Thread nicht, ein Element zu ändern, während ein anderer Thread darüber iteriert. Wenn der Änderungsvorgang (Hinzufügen, Entfernen usw.) ausgeführt wird, löst das Programm eine ConcurrentModificationException aus . Dies ist nicht der einzige Fall, in dem diese Ausnahme auftritt. Eine tiefergehende Betrachtung würde jedoch den Rahmen dieses Artikels sprengen.

Beispiel

Schauen wir uns ein Beispiel an, wie diese Ausnahme auftritt.
import java.util.List;
import java.util.Iterator;
import java.util.ArrayList;

//Test driver for ConcurrentModificationException
public class ConcurrentModificationExceptionTestDriver1 {

	public static void main(String[] args) {
		List<String> businessDays = new ArrayList<>();

		businessDays.add("Monday");
		businessDays.add("Tuesday");
		businessDays.add("Wednesday");
		businessDays.add("Thursday");
		businessDays.add("Friday");
		businessDays.add("Saturday");
		businessDays.add("Sunday");

		Iterator<String> iterator = businessDays.iterator();
		while (iterator.hasNext()) {
			String day = iterator.next();
			if (day.equals("Sunday")) {
				// removing a list item while iterating
				// leading to java.util.ConcurrentModificationException
				businessDays.remove(day);
			}
		}
	}
}

Ausgabe

Ausnahme im Thread „main“ java.util.ConcurrentModificationException bei java.base/java.util.ArrayList$Itr.checkForComodification(ArrayList.java:1042) bei java.base/java.util.ArrayList$Itr.next(ArrayList.java :996) bei meilenstein.thirty.seven.ConcurrentModificationExceptionTestDriver1.main(ConcurrentModificationExceptionTestDriver1.java:22)

Wie vermeide ich ConcurrentModificationException in Java?

Es gibt verschiedene Problemumgehungen für die ConcurrentModificationException . Hier sind einige eingetragen. Sie können sich je nach Bedarf für jeden entscheiden.
  1. Vermeiden Sie Änderungen während der Iteration.
  2. Verwenden Sie herkömmliche Schleifen für gleichzeitige Iteration und Änderung.
  3. Erstellen Sie eine Kopie der zu ändernden Werte, während Sie Iteratoren verwenden. Aktualisieren Sie die Werte, sobald die Iteration beendet ist.

Beispiel

Hier ist ein Beispiel dafür, wie Sie die ConcurrentModificationException vermeiden können .
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

//Test driver for ConcurrentModificationException
public class ConcurrentModificationExceptionTestDriver2 {

	public static void main(String[] args) {

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

		businessDays.add("Monday");
		businessDays.add("Tuesday");
		businessDays.add("Wednesday");
		businessDays.add("Thursday");
		businessDays.add("Friday");
		businessDays.add("Saturday");
		businessDays.add("Sunday");

		System.out.println("Initial Business Days: " + businessDays);

		// Method II - Using traditional for loop
		for (int i = 0; i < businessDays.size(); i++) {
			if (businessDays.get(i).equals("Sunday")) {
				businessDays.remove(i);
			}
		}

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

		// Method III - Creating a copy of elements
		while (iterator.hasNext()) {
			String day = iterator.next();
			if (day.equals("Saturday")) {
				// Add values to be removed in the list
				businessDaysToBeRemoved.add(day);
			}
		}
		businessDays.removeAll(businessDaysToBeRemoved);
		System.out.println("Final Business Days: " + businessDays);
	}
}

Ausgabe

Erste Geschäftstage: [Montag, Dienstag, Mittwoch, Donnerstag, Freitag, Samstag, Sonntag] Letzte Geschäftstage: [Montag, Dienstag, Mittwoch, Donnerstag, Freitag]

Abschluss

Das war eine schnelle Portion Umgang mit der ConcurrentModificationException in Java. Steigen Sie jederzeit ein, wenn Sie nicht weiterkommen. Wie immer sind Übung und Geduld der Schlüssel zum Vorankommen. Bis dahin lernen Sie weiter und wachsen Sie weiter.