Back to questions
СБЕР
Senior
8
Почему CopyOnWriteArrayList не бросает ConcurrentModificationException при модификации во время итерации?
Companies where asked
Answer from AI
sobes.tech AI
CopyOnWriteArrayList не бросает ConcurrentModificationException при модификации во время итерации, потому что его итераторы работают по снимку (snapshot) массива, который был актуален на момент создания итератора.
В отличие от обычных коллекций, где итератор отслеживает изменения структуры коллекции и при обнаружении модификации выбрасывает исключение, CopyOnWriteArrayList при каждой модификации создает новый копированный массив с изменениями. Итератор же продолжает работать с неизменяемым массивом, который был в момент его создания.
Это обеспечивает:
- Безопасную итерацию без ConcurrentModificationException.
- Итератор видит консистентное состояние коллекции на момент начала итерации.
Однако стоит учитывать, что:
- Модификации (add, remove и т.п.) дорогостоящие из-за копирования массива.
- Итератор не отражает изменения, сделанные после его создания.
Пример:
CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>();
list.add("A");
list.add("B");
for (String s : list) {
System.out.println(s);
list.add("C"); // не вызовет ConcurrentModificationException
}
В этом примере итератор не увидит добавленный "C" во время прохода.