logo

ConcurrentModificationException i Java

ConcurrentModificationException oppstår når et objekt forsøkes modifisert samtidig når det ikke er tillatt. Dette unntaket kommer vanligvis når man jobber med Java Collection klasser .

For eksempel - Det er ikke tillatt for en tråd å endre en samling når en annen tråd gjentar den. Dette er fordi resultatet av iterasjonen blir udefinert med den. Noen implementeringer av Iterator-klassen kaster dette unntaket, inkludert alle de generelle implementeringene av Iterator som leveres av JRE. Iteratorer som gjør dette kalles mislykkes raskt da de kaster unntaket raskt så snart de møter en slik situasjon i stedet for å møte ubestemt oppførsel fra samlingen når som helst i fremtiden.

hvordan sjekke skjermstørrelsen på skjermen

Merk:Det er ikke obligatorisk at dette unntaket blir kastet bare når en annen tråd prøver å endre et samlingsobjekt. Det kan også skje hvis en enkelt tråd har noen metoder kalt som prøver å bryte kontrakten til objektet. Dette kan skje når en tråd prøver å endre samlingsobjektet mens det gjentas av noenfeil-rask iterator, vil iteratoren kaste unntaket.

Eksempel

 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); } } } 

Produksjon:

ConcurrentModificationException i Java

Denne meldingen sier at unntaket blir kastet når neste metode kalles da iteratoren itererer listen og vi gjør endringer i den samtidig. Men hvis vi gjør endringer i hashmap som gitt nedenfor, vil det ikke gi noe slikt unntak ettersom størrelsen på hashmap ikke endres.

For eksempel-

linux operativsystem
 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); } } } } 

Produksjon:

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

Dette eksemplet fungerer helt fint, da mens iteratoren itererer over kartet, endres ikke størrelsen på kartet. Kun kartet oppdateres i hvis uttalelse .

Konstruktører av ConcurrentModificationException

Det er 4 typer konstruktører av ConcurrentModificationException -

java arkitektur
  1. public ConcurrentModificationException() -
    Dette oppretter et ConcurrentModificationException uten parametere.
  2. offentlig ConcurrentModificationException (strengmelding)
    Dette oppretter et ConcurrentModificationException med en detaljert melding som spesifiserer unntaket.
  3. offentlig ConcurrentModificationException (årsak som kan kastes)
    Dette skaper et ConcurrentModificationException med en årsak og en melding som er (cause==null?null:cause.toString()). Årsaken blir senere hentet av Throwable.getCause().
  4. offentlig ConcurrentModificationException (strengmelding, årsak som kan kastes)
    Dette skaper et ConcurrentModificationException med en detaljert melding og en årsak. (cause==null?null:cause.toString()). Meldingen blir senere hentet av Throwable.getMessage() og årsaken blir senere hentet av Throwable.getCause().

Hvordan unngå ConcurrentModificationException i et flertrådsmiljø?

For å unngå ConcurrentModificationException i et flertrådsmiljø, kan vi følge følgende måter-

  1. I stedet for å iterere over samlingsklassen, kan vi iterere over matrisen. På denne måten kan vi jobbe veldig bra med små lister, men dette vil tømme ytelsen hvis matrisestørrelsen er veldig stor.
  2. En annen måte kan være å låse listen ved å legge den i den synkroniserte blokken. Dette er ikke en effektiv tilnærming da det eneste formålet med å bruke multi-threading er gitt avkall på dette.
  3. JDK 1.5 eller høyere gir klasser ConcurrentHashMap og CopyOnWriteArrayList. Disse klassene hjelper oss med å unngå samtidige modifikasjonsunntak.

Hvordan unngå ConcurrentModificationException i et enkelt-tråds miljø?

Ved å bruke iterators remove()-funksjon, kan du fjerne et objekt fra et underliggende samlingsobjekt.