В этой статье мы обсуждаем ConcurrentModificationException. Мы обсуждаем такие области, как Что такое ConcurrentModificationException? Когда возникает это исключение? Как решить _3 _? .. и т. Д.

Во-первых, давайте посмотрим, что на самом деле представляет собой ConcurrentModificationException.

Что такое ConcurrentModificationException?

Как правило, ConcurrentModificationException вызывает, когда объект пытается изменить одновременно, когда это недопустимо. Как правило, реализации коллекции вызывают это исключение.

Когда два потока обращаются к коллекции, и один поток выполняет итерацию по коллекции, а другой поток вставляет дополнительную запись в коллекцию. В этой ситуации бросается ConcurrentModificationException.

Исключение ConcurrentModificationException возникает только в многопоточной среде? Разве он не может создать исключение ConcurrentModificationException в однопоточной среде?

ConcurrentModificationException - это не только свойство многопоточной среды. Однопоточная среда также выдает ConcurrentModificationException.

Приведенные ниже строки кода генерируют ConcurrentModificationException. Можете ли вы сказать, почему он генерирует ConcurrentModificationException?

В приведенном выше примере список alphabet начинает итерацию в строке номер 8. Но во время итерации пытается поместить новую запись в alphabet list в строке номер 11. Это не так. разрешено ArrayList the implementation. Таким образом, система выдает ConcurrentModificationException на итерации по времени после вставки новой записи.

Как Arraylist выдает исключение ConcurrentModificationException?

Давайте быстро проанализируем, как реализация ArrayList выдает ConcurrentModificationException и почему она это делает? Давайте углубимся в ArrayList код реализации и выясним, почему.

Вы заметили переменную modCount при отладке реализации списка, например ArrayList, Vector или LinkedList?

modCount означает счетчик изменений. Он будет увеличиваться при каждой ArrayList модификации. Например, если вы добавляете новый элемент в ArrayList , то значение modCount увеличивается на единицу. Также, если вы удаляете элемент из ArrayList, тогда также modCount value увеличивается на единицу. В целом можно сказать, что modCount value определяет количество изменений в списке.

Вернитесь к выводу нашей выше программы. В приведенной выше программе выводятся четыре алфавита, но после этого печатается ConcurentModificationException.

Exception in thread "main" a
b
c
d
java.util.ConcurrentModificationException
at java.base/java.util.ArrayList$Itr.checkForComodification(ArrayList.java:1042)
at java.base/java.util.ArrayList$Itr.next(ArrayList.java:996)
at com.lici.exception.Example.main(Example.java:13)

ArrayList не поощряет модификацию во время итерации. В этом примере вы можете видеть, что он пытается вставить букву е во время итерации. Вот почему ArrayList выдает ConcurrentModificationException.

Посмотрим, как ArrayList бросает ConcurrentModificationException. При итерации каждого элемента в ArrayList он проверяет все изменения, которые происходят в ArrayList. Это делается путем сохранения текущего значения modCount в локальной переменной перед итерацией, и во время каждой итерации он будет следить за тем, чтобы значение локальной переменной и modCount values ​​совпадали. Если нет, то система выкидывает ConcurrentModificationException.

Почему ArrayList выдает исключение ConcurrentModificationException?

Если ArrayList разрешает модификацию во время итерации, то итерация списка полностью испорчена. Это не обрабатывается в реализации ArrayList. Вот почему выкидывает ConcurrentModificationException.

Но я хочу изменить список во время итерации. Есть ли способ сделать это без создания исключения ConcurrentModificationException?

ConcurrentModificationException бросает как часть ArrayList$Iterator реализации. Если вы перебираете список, используя обычный цикл for, он не будет генерировать ConcurrentModificationException . Вот код для этого.