ConcurrentModificationException en Java con ejemplos

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.

  1. Si se detecta esta excepción, los resultados de la iteración no están definidos.
  2. 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);
        }
    }
}
Producción:

ArrayList: 
One, 

Trying to add an element in between iteration

java.util.ConcurrentModificationException

¿Cómo evitar ConcurrentModificationException?

Para evitar esta excepción,

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);
        }
    }
}
Producción:

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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *