Sobes.tech
Senior
42

Почему CopyOnWriteArrayList не бросает ConcurrentModificationException при модификации во время итерации?

Сұралған компаниялар
СБЕРСБЕР

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" во время прохода.