Ответ
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).
Когда использовать: Когда операции чтения значительно превосходят по количеству операции записи, и критически важна безопасность итерации в многопоточной среде.