logo

ConcurrentModificationException in Java

L'excepció ConcurrentModificationException es produeix quan s'intenta modificar simultàniament un objecte quan no és permès. Aquesta excepció sol venir quan es treballa Classes de col·lecció Java .

Per exemple - No es permet que un fil modifiqui una col·lecció quan un altre fil està iterant-hi. Això es deu al fet que el resultat de la iteració esdevé indefinit amb ell. Alguna implementació de la classe Iterator llança aquesta excepció, incloses totes aquelles implementacions de propòsit general d'Iterator proporcionades pel JRE. Els iteradors que fan això s'anomenen falla-ràpid ja que llancen l'excepció ràpidament tan bon punt es troben amb aquesta situació en lloc d'enfrontar-se a un comportament indeterminat de la col·lecció en qualsevol moment en el futur.

derivats parcials en làtex

Nota:No és obligatori que aquesta excepció s'hagi llançat només quan un altre fil intenti modificar un objecte Col·lecció. També pot passar si un sol fil té alguns mètodes anomenats que intenten violar el contracte de l'objecte. Això pot passar quan un fil intenta modificar l'objecte Col·lecció mentre algú l'està iterantiterador de falla ràpida, l'iterador llançarà l'excepció.

Exemple

 import java.awt.List; import java.util.*; public class Concurrentmodificationexception { public static void main(String[] args) { ArrayList list = new ArrayList(); list.add(1); list.add(2); list.add(3); list.add(4); list.add(5); Iterator it = list.iterator(); while (it.hasNext()) { Integer value = it.next(); System.out.println('List Value:' + value); if (value.equals(3)) list.remove(value); } } } 

Sortida:

ConcurrentModificationException in Java

Aquest missatge diu que l'excepció es llança quan es crida el següent mètode, ja que l'iterador està iterant la llista i hi estem fent modificacions simultàniament. Però si fem modificacions al mapa hash com es mostra a continuació, no hi haurà cap excepció, ja que la mida del mapa hash no canviarà.

Per exemple-

comproveu el null a Java
 import java.awt.List; import java.util.*; public class concurrentmodificationexception { public static void main(String[] args) { HashMap map = new HashMap(); map.put(1, 1); map.put(2, 2); map.put(3,3); Iterator it = map.keySet().iterator(); while(it.hasNext()) { Integer key = it.next(); System.out.println('Map Value:' + map.get(key)); if (key.equals(2)) { map.put(1, 4); } } } } 

Sortida:

 Map Value:1 Map Value:2 Map Value:3 

Aquest exemple funciona completament bé, ja que mentre l'iterador està iterant sobre el mapa, la mida del mapa no canvia. Només el mapa s'està actualitzant al declaració si .

Constructors de ConcurrentModificationException

Hi ha 4 tipus de constructors de ConcurrentModificationException -

tipus de dades en java
  1. public ConcurrentModificationException()-
    Això crea una ConcurrentModificationException sense paràmetres.
  2. public ConcurrentModificationException (missatge de cadena)
    Això crea una ConcurrentModificationException amb un missatge detallat que especifica l'excepció.
  3. public ConcurrentModificationException (causa llançable)
    Això crea una ConcurrentModificationException amb una causa i un missatge que és (cause==null?null:cause.toString()). La causa es recupera més tard per Throwable.getCause().
  4. public ConcurrentModificationException (missatge de cadena, causa llançable)
    Això crea una ConcurrentModificationException amb un missatge detallat i una causa. (causa==null?null:cause.toString()). Throwable.getMessage() recupera el missatge més tard i Throwable.getCause() recupera la causa.

Com evitar ConcurrentModificationException en un entorn multiprocés?

Per evitar la ConcurrentModificationException en un entorn multiprocés, podem seguir les següents maneres:

  1. En lloc d'iterar sobre la classe de col·lecció, podem iterar sobre la matriu. D'aquesta manera, podem treballar molt bé amb llistes de mida petita, però això esgotarà el rendiment si la mida de la matriu és molt gran.
  2. Una altra manera pot ser bloquejar la llista col·locant-la al bloc sincronitzat. Aquest no és un enfocament eficaç, ja que es renuncia a l'únic propòsit d'utilitzar multi-threading.
  3. JDK 1.5 o superior proporciona classes ConcurrentHashMap i CopyOnWriteArrayList. Aquestes classes ens ajuden a evitar l'excepció de modificació concurrent.

Com evitar ConcurrentModificationException en un entorn d'un sol fil?

Mitjançant l'ús de la funció remove() de l'iterador, podeu eliminar un objecte d'un objecte de col·lecció subjacent.