logo

ConcurrentModificationException Javassa

ConcurrentModificationException esiintyy, kun objektia yritetään muokata samanaikaisesti, kun se ei ole sallittua. Tämä poikkeus tulee yleensä silloin, kun joku työskentelee Java Collection -luokat .

Esimerkiksi - Ei ole sallittua, että säiettä muokkaa Kokoelmaa, kun jokin toinen säiettä iteroi sen yli. Tämä johtuu siitä, että iteroinnin tulos muuttuu määrittelemättömäksi sen kanssa. Jotkin Iterator-luokan toteutukset tekevät tämän poikkeuksen, mukaan lukien kaikki ne yleiskäyttöiset Iterator-toteutukset, jotka JRE tarjoaa. Iteraattoreita, jotka tekevät tämän, kutsutaan epäonnistuu nopeasti koska he tekevät poikkeuksen nopeasti heti kun he kohtaavat tällaisen tilanteen sen sijaan, että kohtaavat kokoelman määrittelemätöntä käyttäytymistä milloin tahansa tulevaisuudessa.

muuntaa boolen merkkijonoksi

Huomautus:Ei ole pakollista, että tämä poikkeus heitetään vain, kun jokin muu säie yrittää muokata Collection-objektia. Se voi myös tapahtua, jos yhdellä säikeellä on kutsuttuja menetelmiä, jotka yrittävät rikkoa objektin sopimusta. Näin voi tapahtua, kun säie yrittää muokata Collection-objektia, kun jotkut iteroivat sitänopea iteraattori, iteraattori tekee poikkeuksen.

Esimerkki

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

Lähtö:

ConcurrentModificationException Javassa

Tämä viesti kertoo, että poikkeus heitetään, kun seuraava menetelmä kutsutaan, koska iteraattori iteroi listaa ja teemme siihen muutoksia samanaikaisesti. Mutta jos teemme muutoksia hashmappiin alla esitetyllä tavalla, se ei aiheuta poikkeuksia, koska hashmapin koko ei muutu.

Esimerkiksi-

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

Lähtö:

java päivämäärä ajan tasalla
 Map Value:1 Map Value:2 Map Value:3 

Tämä esimerkki toimii täysin hyvin, sillä kun iteraattori iteroi kartalla, kartan koko ei muutu. Vain karttaa päivitetään jos lausunto .

ConcurrentModificationExceptionin rakentajat

ConcurrentModificationExceptionin rakentajia on 4 tyyppiä -

jasmine davis lapsena
  1. julkinen ConcurrentModificationException() -
    Tämä luo ConcurrentModificationExceptionin ilman parametreja.
  2. julkinen ConcurrentModificationException(merkkijonoviesti)
    Tämä luo ConcurrentModificationExceptionin, jossa on yksityiskohtainen poikkeuksen määrittävä viesti.
  3. julkinen ConcurrentModificationException (heitettävä syy)
    Tämä luo ConcurrentModificationExceptionin, jossa on syy ja sanoma, joka on (cause==null?null:cause.toString()). Throwable.getCause() hakee syyn myöhemmin.
  4. julkinen ConcurrentModificationException (merkkijonoviesti, heitettävissä oleva syy)
    Tämä luo ConcurrentModificationExceptionin, jossa on yksityiskohtainen viesti ja syy. (cause==null?null:cause.toString()). Viestin noutaa myöhemmin Throwable.getMessage() ja syyn myöhemmin Throwable.getCause().

Kuinka välttää ConcurrentModificationException monisäikeisessä ympäristössä?

ConcurrentModificationExceptionin välttämiseksi monisäikeisessä ympäristössä voimme noudattaa seuraavia tapoja:

  1. Sen sijaan, että iteroisimme kokoelmaluokan yli, voimme iteroida taulukon yli. Tällä tavalla voimme työskennellä erittäin hyvin pienikokoisten listojen kanssa, mutta tämä heikentää suorituskykyä, jos taulukon koko on erittäin suuri.
  2. Toinen tapa voi olla listan lukitseminen asettamalla se synkronoituun lohkoon. Tämä ei ole tehokas lähestymistapa, koska tämä luopuu monisäikeisen käytön ainoasta tarkoituksesta.
  3. JDK 1.5 tai uudempi sisältää ConcurrentHashMap- ja CopyOnWriteArrayList-luokat. Nämä luokat auttavat meitä välttämään samanaikaiset muutospoikkeukset.

Kuinka välttää ConcurrentModificationException yksisäikeisessä ympäristössä?

Käyttämällä iteraattorin remove()-funktiota voit poistaa objektin alla olevasta kokoelmaobjektista.