logo

ConcurrentModificationException u Javi

ConcurrentModificationException se događa kada se objekt pokušava istovremeno modificirati kada to nije dopušteno. Ova iznimka obično dolazi kada se radi sa Klase Java zbirke .

Na primjer - Nije dopušteno da nit mijenja kolekciju kada neka druga nit ponavlja preko nje. To je zato što rezultat iteracije s njim postaje nedefiniran. Neka implementacija klase Iterator izbacuje ovu iznimku, uključujući sve one implementacije Iteratora opće namjene koje pruža JRE. Iteratori koji to rade nazivaju se fail-fast jer brzo izbacuju iznimku čim naiđu na takvu situaciju, umjesto da se suoče s neodređenim ponašanjem zbirke bilo kada u budućnosti.

kako pretvoriti niz u cijeli broj

Bilješka:Nije obavezno da će se ova iznimka izbaciti samo kada neka druga nit pokuša modificirati objekt zbirke. To se također može dogoditi ako jedna nit ima pozvane metode koje pokušavaju prekršiti ugovor objekta. To se može dogoditi kada nit pokušava modificirati objekt zbirke dok ga neki ponavljajufail-fast iterator, iterator će izbaciti iznimku.

Primjer

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

Izlaz:

ConcurrentModificationException u Javi

Ova poruka kaže da se iznimka javlja kada se pozove sljedeća metoda jer iterator ponavlja popis, a mi u njemu istovremeno radimo izmjene. Ali ako napravimo izmjene u hashmapu kao što je navedeno u nastavku, tada neće biti iznimke jer se veličina hashmapa neće promijeniti.

koliko mb u gb

Na primjer-

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

Izlaz:

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

Ovaj primjer radi potpuno dobro jer dok iterator ponavlja po mapi, veličina karte se ne mijenja. Samo se karta ažurira u izjava if .

Konstruktori ConcurrentModificationException

Postoje 4 vrste konstruktora ConcurrentModificationException -

preuzimanje xvideoservicethief ubuntu 14.04
  1. public ConcurrentModificationException() -
    Ovo stvara iznimku ConcurrentModificationException bez parametara.
  2. public ConcurrentModificationException(String poruka)
    Ovo stvara ConcurrentModificationException s detaljnom porukom koja navodi iznimku.
  3. public ConcurrentModificationException(Throwable reason)
    Ovo stvara ConcurrentModificationException s uzrokom i porukom koja je (cause==null?null:cause.toString()). Uzrok kasnije dohvaća Throwable.getCause().
  4. public ConcurrentModificationException(String message, Throwable cause)
    Ovo stvara ConcurrentModificationException s detaljnom porukom i uzrokom. (uzrok==null?null:cause.toString()). Poruku kasnije dohvaća Throwable.getMessage(), a uzrok kasnije dohvaća Throwable.getCause().

Kako izbjeći ConcurrentModificationException u okruženju s više niti?

Kako bismo izbjegli ConcurrentModificationException u okruženju s više niti, možemo slijediti sljedeće načine-

  1. Umjesto iteracije po klasi zbirke, možemo iterirati po nizu. Na ovaj način možemo vrlo dobro raditi s popisima male veličine, ali to će smanjiti izvedbu ako je veličina polja vrlo velika.
  2. Drugi način može biti zaključavanje popisa stavljanjem u sinkronizirani blok. Ovo nije učinkovit pristup jer se time odriče jedine svrhe korištenja višenitnosti.
  3. JDK 1.5 ili noviji nudi klase ConcurrentHashMap i CopyOnWriteArrayList. Ove nam klase pomažu u izbjegavanju iznimke istodobne izmjene.

Kako izbjeći ConcurrentModificationException u jednonitnom okruženju?

Korištenjem iteratorove funkcije remove() možete ukloniti objekt iz temeljnog objekta zbirke.