ConcurrentModificationException rodas, ja objektu mēģina vienlaikus modificēt, ja tas nav pieļaujams. Šis izņēmums parasti rodas, strādājot ar Java kolekcijas nodarbības .
Piemēram - Nav pieļaujams, ka pavediens pārveido kolekciju, ja pa to atkārtojas kāds cits pavediens. Tas ir tāpēc, ka iterācijas rezultāts ar to kļūst nenoteikts. Dažas Iterator klases implementācijas rada šo izņēmumu, tostarp visas tās vispārējas nozīmes Iterator implementācijas, kuras nodrošina JRE. Tiek saukti iteratori, kas to dara neveiksmīgs jo viņi ātri izdara izņēmumu, tiklīdz saskaras ar šādu situāciju, nevis saskaras ar kolekcijas nenoteiktu uzvedību jebkurā laikā nākotnē.
skudra pret maven
Piezīme:Nav obligāti, ka šis izņēmums tiks izmests tikai tad, kad kāds cits pavediens mēģina modificēt kolekcijas objektu. Tas var notikt arī tad, ja vienam pavedienam ir izsauktas metodes, kas mēģina pārkāpt objekta līgumu. Tas var notikt, ja pavediens mēģina modificēt kolekcijas objektu, kamēr daži to atkārtoatteices ātrs iterators, iterators izmetīs izņēmumu.
Piemērs
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); } } }
Izvade:
Šajā ziņojumā teikts, ka izņēmums tiek izsaukts, kad tiek izsaukta nākamā metode, jo iterators atkārto sarakstu un mēs tajā vienlaikus veicam izmaiņas. Bet, ja mēs veicam modifikācijas hashmap, kā norādīts tālāk, tas neradīs nekādus izņēmumus, jo hashmap izmērs nemainīsies.
kas ir awt
Piemēram-
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); } } } }
Izvade:
Map Value:1 Map Value:2 Map Value:3
Šis piemērs darbojas pilnīgi labi, jo, kamēr iterators atkārto karti, kartes izmērs nemainās. Tiek atjaunināta tikai karte ja paziņojums .
ConcurrentModificationException konstruktori
Pastāv 4 ConcurrentModificationException konstruktoru veidi -
virknes java masīvs
- publisks ConcurrentModificationException() -
Tādējādi tiek izveidots ConcurrentModificationException bez parametriem. - publisks ConcurrentModificationException (virknes ziņojums)
Tādējādi tiek izveidots ConcurrentModificationException ar detalizētu ziņojumu, kurā norādīts izņēmums. - publisks ConcurrentModificationException (izmetams iemesls)
Tādējādi tiek izveidots ConcurrentModificationException ar cēloni un ziņojumu, kas ir (cause==null?null:cause.toString()). Cēlonis vēlāk tiek izgūts, izmantojot Throwable.getCause(). - publisks ConcurrentModificationException (virknes ziņojums, izmešanas iemesls)
Tādējādi tiek izveidots ConcurrentModificationException ar detalizētu ziņojumu un iemeslu. (cause==null?null:cause.toString()). Ziņojumu vēlāk izgūst Throwable.getMessage(), un cēloni vēlāk izgūst Throwable.getCause().
Kā izvairīties no ConcurrentModificationException daudzpavedienu vidē?
Lai izvairītos no ConcurrentModificationException daudzpavedienu vidē, mēs varam rīkoties šādi:
- Tā vietā, lai atkārtotu kolekcijas klasi, mēs varam atkārtot masīvu. Tādā veidā mēs varam ļoti labi strādāt ar maza izmēra sarakstiem, taču tas pasliktinās veiktspēju, ja masīva lielums ir ļoti liels.
- Vēl viens veids var būt saraksta bloķēšana, ievietojot to sinhronizētajā blokā. Šī pieeja nav efektīva, jo tādējādi tiek zaudēts vienīgais vairāku vītņu izmantošanas mērķis.
- JDK 1.5 vai jaunāka versija nodrošina ConcurrentHashMap un CopyOnWriteArrayList klases. Šīs klases palīdz mums izvairīties no vienlaicīgu modifikāciju izņēmuma.
Kā viena pavediena vidē izvairīties no ConcurrentModificationException?
Izmantojot iteratora Remove() funkciju, varat noņemt objektu no pamatā esošā kolekcijas objekta.