CodeGym /Blog Java /Random-ES /Excepción de modificación concurrente en Java
John Squirrels
Nivel 41
San Francisco

Excepción de modificación concurrente en Java

Publicado en el grupo Random-ES

¿Qué es ConcurrentModificationException en Java?

"La excepción ConcurrentModificationException ocurre cuando se modifica un recurso sin tener los privilegios de modificación".
En otras palabras, la excepción Java ConcurrentModificationException (como su nombre indica) se produce debido al problema de concurrencia. Se supone que tiene conocimientos previos sobre subprocesos y subprocesos múltiples antes de continuar. Algunas clases en Java, como las clases de Colección, no permiten que un hilo modifique un elemento mientras otro hilo itera sobre él. Si se realiza la operación de modificación (agregar, eliminar, etc.), el programa arroja ConcurrentModificationException . Este no es el único caso en el que se produce esta excepción. Sin embargo, profundizar más estará fuera del alcance de este artículo.

Ejemplo

Veamos un ejemplo de cómo ocurre esta excepción.
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);
			}
		}
	}
}

Producción

Excepción en el hilo "principal" java.util.ConcurrentModificationException en java.base/java.util.ArrayList$Itr.checkForComodification(ArrayList.java:1042) en java.base/java.util.ArrayList$Itr.next(ArrayList.java :996) en hito.treinta.siete.ConcurrentModificationExceptionTestDriver1.main(ConcurrentModificationExceptionTestDriver1.java:22)

¿Cómo evitar la excepción ConcurrentModificationException en Java?

Existen diferentes soluciones para ConcurrentModificationException . Aquí se alistan algunos. Puede optar por cualquiera según sus necesidades.
  1. Evite modificaciones durante la iteración.
  2. Utilice bucles tradicionales para iteración y modificación simultáneas.
  3. Cree una copia de los valores que se modificarán mientras utiliza iteradores. Actualice los valores una vez finalizada la iteración.

Ejemplo

A continuación se muestra un ejemplo de cómo puede evitar 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);
	}
}

Producción

Días hábiles iniciales: [lunes, martes, miércoles, jueves, viernes, sábado, domingo] Días hábiles finales: [lunes, martes, miércoles, jueves, viernes]

Conclusión

Esa fue una dosis rápida para lidiar con ConcurrentModificationException en Java. Siéntete libre de subirte cuando te sientas estancado. Como siempre, la clave para seguir adelante es la práctica y la paciencia. Hasta entonces, sigue aprendiendo y sigue creciendo.
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION