Как работает итерация в CopyOnWriteArrayList при одновременном добавлении элементов?

«Как работает итерация в CopyOnWriteArrayList при одновременном добавлении элементов?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Итератор работает с "снимком" (snapshot) массива на момент своего создания. Это гарантирует отсутствие ConcurrentModificationException.

Механизм:

  1. При вызове iterator() создается копия текущего внутреннего массива.
  2. Все модифицирующие операции (add, set, remove) работают с новой копией массива.
  3. Итератор продолжает обход исходного снимка, не видя последующих изменений.

Пример:

CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>(List.of("A", "B"));
Iterator<String> iterator = list.iterator();

list.add("C"); // Создается новая копия массива [A, B, C]

while (iterator.hasNext()) {
    System.out.print(iterator.next() + " "); // Выводит: A B (старый снимок)
}
System.out.println(list); // Выводит: [A, B, C] (актуальное состояние)

Характеристики и применение:

  • Плюс: Полная безопасность при итерации.
  • Минус: Итератор не отражает изменения после его создания; операции записи дороги из-за копирования массива.
  • Идеально подходит для сценариев «частое чтение, редкая запись» (read-heavy).