Что такое Fail Safe итератор в Java?

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

Ответ

Fail Safe итератор — это итератор коллекции, который не выбрасывает ConcurrentModificationException при структурном изменении исходной коллекции (добавление, удаление элементов) во время итерации. Это достигается за счет работы с копией данных или использованием механизмов конкурентного доступа.

Как это работает? Итератор создает снимок (snapshot) данных коллекции на момент своего создания. Все изменения исходной коллекции не влияют на этот снимок.

Пример с CopyOnWriteArrayList:

import java.util.concurrent.CopyOnWriteArrayList;
import java.util.Iterator;

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

// Итератор работает с "снимком" [A, B, C]
while (iterator.hasNext()) {
    String element = iterator.next();
    System.out.print(element + " "); // Выведет: A B C
    if ("B".equals(element)) {
        list.add("D"); // Изменяем исходную коллекцию
    }
}
System.out.println();
System.out.println("Итоговая коллекция: " + list); // [A, B, C, D]
// Обратите внимание: элемент 'D' не был виден в цикле выше.

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

  • Плюсы:
    • Абсолютная безопасность в многопоточных сценариях.
    • Отсутствие блокировок на операциях чтения (очень быстро).
  • Минусы:
    • Работа с устаревшими данными: Итератор может не видеть последние изменения.
    • Налог на память: Создание копии данных при каждой модификации.
    • Не поддерживает Iterator.remove().

Типичные Fail Safe коллекции: CopyOnWriteArrayList, CopyOnWriteArraySet, ConcurrentHashMap (его итераторы также условно fail-safe).

Когда использовать: Когда операции чтения значительно превосходят по количеству операции записи, и критически важна безопасность итерации в многопоточной среде.