ConcurrentModificationException en un entorno de subprocesos múltiples
En un entorno de subprocesos múltiples , si durante la detección del recurso, cualquier método encuentra que hay una modificación simultánea de ese objeto que no está permitida, entonces se puede generar esta ConcurrentModificationException.
- Si se detecta esta excepción, los resultados de la iteración no están definidos.
- Por lo general, algunas implementaciones de iteradores eligen lanzar esta excepción tan pronto como se encuentra, lo que se denomina iteradores rápidos .
Por ejemplo: si estamos tratando de modificar cualquier colección en el código usando un hilo, pero otro hilo ya está usando esa colección, entonces esto no estará permitido.
ConcurrentModificationException en un entorno de subproceso único
Dado que no hay garantía de que cada vez que se genera esta excepción, un objeto haya sido modificado simultáneamente por algún subproceso diferente, esta excepción también se genera en el entorno de un solo subproceso .
Si invocamos una secuencia de métodos en un objeto que viola su contrato, entonces el objeto lanza ConcurrentModificationException.
Por ejemplo: si mientras iteramos sobre la colección, tratamos directamente de modificar esa colección, entonces el iterador a prueba de fallas dado lanzará esta ConcurrentModificationException.
Ejemplo: en el siguiente código, se implementa una ArrayList. Luego se le agregan pocos valores y se le hacen pocas modificaciones mientras se atraviesa,
// Java program to show // ConcurrentModificationException import java.util.Iterator; import java.util.ArrayList; public class modificationError { public static void main(String args[]) { // Creating an object of ArrayList Object ArrayList<String> arr = new ArrayList<String>(); arr.add("One"); arr.add("Two"); arr.add("Three"); arr.add("Four"); try { // Printing the elements System.out.println( "ArrayList: "); Iterator<String> iter = arr.iterator(); while (iter.hasNext()) { System.out.print(iter.next() + ", "); // ConcurrentModificationException // is raised here as an element // is added during the iteration System.out.println( "\n\nTrying to add" + " an element in " + "between iteration\n"); arr.add("Five"); } } catch (Exception e) { System.out.println(e); } } }
ArrayList: One, Trying to add an element in between iteration java.util.ConcurrentModificationException
¿Cómo evitar ConcurrentModificationException?
Para evitar esta excepción,
- Simplemente podemos hacer las modificaciones una vez hecha la iteración, o
- Implementar el concepto de bloque o método sincronizado
Ejemplo: Veamos cómo resolver esta excepción simplemente cambiando el lugar de modificación.
// Java program to show // ConcurrentModificationException import java.util.Iterator; import java.util.ArrayList; public class modificationError { public static void main(String args[]) { // Creating an object of ArrayList Object ArrayList<String> arr = new ArrayList<String>(); arr.add("One"); arr.add("Two"); arr.add("Three"); arr.add("Four"); try { // Printing the elements System.out.println( "ArrayList: "); Iterator<String> iter = arr.iterator(); while (iter.hasNext()) { System.out.print(iter.next() + ", "); } // No exception is raised as // a modification is done // after the iteration System.out.println( "\n\nTrying to add" + " an element in " + "between iteration: " + arr.add("Five")); // Printing the elements System.out.println( "\nUpdated ArrayList: "); iter = arr.iterator(); while (iter.hasNext()) { System.out.print(iter.next() + ", "); } } catch (Exception e) { System.out.println(e); } } }
ArrayList: One, Two, Three, Four, Trying to add an element in between iteration: true Updated ArrayList: One, Two, Three, Four, Five,
A partir de la salida, se puede ver claramente que con cambios mínimos en el código, se puede eliminar ConcurrentModificationException.
Publicación traducida automáticamente
Artículo escrito por sanskar_bindal y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA