CodeGym /Java Blog /Random-IT /ConcurrentModificationException in Java
John Squirrels
Livello 41
San Francisco

ConcurrentModificationException in Java

Pubblicato nel gruppo Random-IT

Cos'è ConcurrentModificationException in Java?

"La ConcurrentModificationException si verifica quando una risorsa viene modificata pur non disponendo dei privilegi di modifica."
In altre parole, la Java ConcurrentModificationException (come suggerisce il nome) si verifica a causa del problema di concorrenza. Si presuppone che tu abbia una conoscenza preliminare dei thread e del multi-threading prima di procedere. Alcune classi in Java, come le classi Collection, non consentono a un thread di modificare un elemento mentre un altro thread sta eseguendo un'iterazione su di esso. Se viene eseguita l'operazione di modifica (aggiunta, rimozione, ecc.), il programma lancia ConcurrentModificationException . Questo non è l'unico caso in cui si verifica questa eccezione. Tuttavia, scavare più a fondo esula dallo scopo di questo articolo.

Esempio

Diamo un'occhiata ad un esempio di come si verifica questa eccezione.
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);
			}
		}
	}
}

Produzione

Eccezione nel thread "main" java.util.ConcurrentModificationException in java.base/java.util.ArrayList$Itr.checkForComodification(ArrayList.java:1042) in java.base/java.util.ArrayList$Itr.next(ArrayList.java :996) su mile.thirty.seven.ConcurrentModificationExceptionTestDriver1.main(ConcurrentModificationExceptionTestDriver1.java:22)

Come evitare ConcurrentModificationException in Java?

Esistono diverse soluzioni alternative per ConcurrentModificationException . Qui ne vengono elencati alcuni. Puoi optare per chiunque secondo le tue esigenze.
  1. Evitare modifiche durante l'iterazione.
  2. Utilizza i cicli tradizionali per l'iterazione e la modifica simultanee.
  3. Crea una copia dei valori da modificare durante l'utilizzo degli iteratori. Aggiorna i valori una volta terminata l'iterazione.

Esempio

Ecco un esempio di come evitare ConcurrentModificationException .
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);
	}
}

Produzione

Giorni lavorativi iniziali: [lunedì, martedì, mercoledì, giovedì, venerdì, sabato, domenica] Giorni lavorativi finali: [lunedì, martedì, mercoledì, giovedì, venerdì]

Conclusione

Questa è stata una rapida dose di gestione della ConcurrentModificationException in Java. Sentiti libero di salire ogni volta che ti senti bloccato. Come sempre, la chiave per andare avanti è la pratica e la pazienza. Fino ad allora, continua a imparare e a crescere.
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION