CodeGym /Blog Java /Random-FR /ConcurrentModificationException en Java
John Squirrels
Niveau 41
San Francisco

ConcurrentModificationException en Java

Publié dans le groupe Random-FR

Qu’est-ce que ConcurrentModificationException en Java ?

"L'exception ConcurrentModificationException se produit lorsqu'une ressource est modifiée alors qu'elle n'a pas les privilèges de modification."
En d’autres termes, l’exception Java ConcurrentModificationException (comme son nom l’indique) se produit en raison d’un problème de concurrence. Il est supposé que vous avez une connaissance préalable des threads et du multi-thread avant de continuer. Certaines classes en Java, comme les classes Collection, ne permettent pas à un thread de modifier un élément pendant qu'un autre thread le parcourt. Si l'opération de modification (ajouter, supprimer, etc.) est effectuée, le programme renvoie ConcurrentModificationException . Ce n’est pas le seul cas où cette exception se produit. Cependant, creuser plus profondément sortirait du cadre de cet article.

Exemple

Regardons un exemple de la façon dont cette exception se produit.
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);
			}
		}
	}
}

Sortir

Exception dans le thread "principal" java.util.ConcurrentModificationException à java.base/java.util.ArrayList$Itr.checkForComodification(ArrayList.java:1042) à java.base/java.util.ArrayList$Itr.next(ArrayList.java :996) à jalon.thirty.seven.ConcurrentModificationExceptionTestDriver1.main(ConcurrentModificationExceptionTestDriver1.java:22)

Comment éviter ConcurrentModificationException en Java ?

Il existe différentes solutions de contournement pour ConcurrentModificationException . En voici quelques-uns. Vous pouvez opter pour n’importe qui selon vos besoins.
  1. Évitez les modifications pendant l'itération.
  2. Utilisez des boucles traditionnelles pour une itération et une modification simultanées.
  3. Créez une copie des valeurs à modifier lors de l'utilisation des itérateurs. Mettez à jour les valeurs une fois l'itération terminée.

Exemple

Voici un exemple de la façon dont vous pouvez éviter le 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);
	}
}

Sortir

Jours ouvrables initiaux : [lundi, mardi, mercredi, jeudi, vendredi, samedi, dimanche] Jours ouvrables finaux : [lundi, mardi, mercredi, jeudi, vendredi]

Conclusion

C’était une dose rapide de gestion de l’ exception ConcurrentModificationException en Java. N'hésitez pas à monter à bord chaque fois que vous vous sentez coincé. Comme toujours, la clé pour avancer est la pratique et la patience. D’ici là, continuez à apprendre et continuez à grandir.
Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION