logo

ЦонцуррентМодифицатионЕкцептион у Јави

Изузетак ЦонцуррентМодифицатионЕкцептион се јавља када се објекат покуша да се модификује истовремено када то није дозвољено. Овај изузетак обично долази када неко ради са Јава Цоллецтион класе .

На пример - Није дозвољено да нит модификује колекцију када нека друга нит итерира преко ње. То је зато што резултат итерације са њим постаје недефинисан. Нека имплементација класе Итератор изазива овај изузетак, укључујући све оне имплементације Итератор опште намене које обезбеђује ЈРЕ. Итератори који то раде се зову неуспешан јер брзо бацају изузетак чим наиђу на такву ситуацију уместо да се суоче са неодређеним понашањем колекције било када у будућности.

линук минт цимет вс мате

Белешка:Није обавезно да ће овај изузетак бити избачен само када нека друга нит покуша да измени објекат колекције. То се такође може десити ако једна нит има неке позване методе које покушавају да наруше уговор објекта. Ово се може десити када нит покушава да измени објекат колекције док га неки понављајубрзи итератор, итератор ће избацити изузетак.

Пример

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

Излаз:

ЦонцуррентМодифицатионЕкцептион у Јави

Ова порука каже да је изузетак избачен када се позове следећи метод пошто итератор понавља листу и ми истовремено вршимо измене у њој. Али ако извршимо измене у хасхмапу као што је дато у наставку, онда неће изазвати ниједан такав изузетак јер се величина хасхмапа неће променити.

мит пуној форми

На пример-

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

Излаз:

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

Овај пример ради потпуно добро јер док итератор итерира преко мапе, величина мапе се не мења. Само мапа се ажурира у иф изјава .

Конструктори ЦонцуррентМодифицатионЕкцептион

Постоје 4 типа конструктора ЦонцуррентМодифицатионЕкцептион -

алгоритам кружног распореда
  1. публиц ЦонцуррентМодифицатионЕкцептион() -
    Ово ствара ЦонцуррентМодифицатионЕкцептион без параметара.
  2. публиц ЦонцуррентМодифицатионЕкцептион (порука стринга)
    Ово ствара ЦонцуррентМодифицатионЕкцептион са детаљном поруком која наводи изузетак.
  3. јавни ЦонцуррентМодифицатионЕкцептион (узрок који се може бацити)
    Ово ствара изузетак ЦонцуррентМодифицатионЕкцептион са узроком и поруком која је (цаусе==нулл?нулл:цаусе.тоСтринг()). Узрок се касније проналази помоћу Тхровабле.гетЦаусе().
  4. публиц ЦонцуррентМодифицатионЕкцептион(порука стринга, узрок који се може бацати)
    Ово ствара изузетак ЦонцуррентМодифицатионЕкцептион са детаљном поруком и узроком. (цаусе==нулл?нулл:цаусе.тоСтринг()). Поруку касније преузима Тхровабле.гетМессаге(), а узрок касније преузима Тхровабле.гетЦаусе().

Како избећи ЦонцуррентМодифицатионЕкцептион у окружењу са више нити?

Да бисмо избегли изузетак ЦонцуррентМодифицатионЕкцептион у окружењу са више нити, можемо следити следеће начине:

  1. Уместо итерације преко класе колекције, можемо итерирати низ низ. На овај начин можемо веома добро да радимо са листама мале величине, али то ће смањити перформансе ако је величина низа веома велика.
  2. Други начин може бити закључавање листе стављањем у синхронизовани блок. Ово није ефикасан приступ јер се тиме напушта једина сврха употребе вишенитног рада.
  3. ЈДК 1.5 или новији обезбеђује класе ЦонцуррентХасхМап и ЦопиОнВритеАрраиЛист. Ове класе нам помажу да избегнемо изузетак истовремених модификација.

Како избећи ЦонцуррентМодифицатионЕкцептион у окружењу са једним навојем?

Коришћењем функције ремове() итератора, можете уклонити објекат из основног објекта колекције.