Получить доступ

Чем fail-fast итератор отличается от weakly consistent?

SeniorКоллекции
Ещё спрашивают так:
  • Почему итератор ConcurrentHashMap не бросает ConcurrentModificationException?
Коротко

Fail-fast итератор (ArrayList, HashMap) замечает структурное изменение коллекции не через него и бросает ConcurrentModificationException — по возможности, без гарантии. Weakly consistent (ConcurrentHashMap, ConcurrentLinkedQueue) не падает, обходит каждый элемент не больше раза и может увидеть часть параллельных изменений.

  • Fail-fast основан на счётчике modCount — это отладочный механизм, не синхронизация
  • CopyOnWriteArrayList — snapshot-итератор: видит копию на момент создания
  • CME возникает и в одном потоке — удаление в for-each

А ещё Полагаться на CME для логики программы нельзя

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Fail-fast. Коллекция ведёт счётчик структурных изменений modCount (добавление, удаление; замена значения — нет). Итератор при создании запоминает его и сверяет в каждом next(). Не совпало — CME. Цель — быстро сообщить об ошибке вместо странного поведения. Гарантии нет: в многопоточном коде без синхронизации изменение может быть не замечено.

Weakly consistent — итераторы коллекций java.util.concurrent:

  • не бросают CME;
  • каждый элемент, присутствовавший при создании итератора и не удалённый, будет возвращён ровно один раз;
  • изменения после создания итератора могут быть видны или нет.

Подходят для обхода разделяемых структур под нагрузкой (мониторинг, сбор статистики), но не дают консистентного снимка.

Snapshot — CopyOnWriteArrayList: итератор работает с копией массива на момент создания, изменения не видны, remove через итератор не поддерживается.

Что хотят услышать

  • Механика fail-fast и modCount.
  • Гарантии weakly consistent.
  • Snapshot-итераторы.

Частые ошибки

  • Считать fail-fast механизмом потокобезопасности.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✗weakly consistent всегда бросает ConcurrentModificationException
  • ✗fail-fast потокобезопасен
  • ✗Они идентичны
  • ✓fail-fast бросает CME при структурном изменении во время обхода; weakly consistent (concurrent-коллекции) не бросает и переживает изменения

Что спросят дальше

  • Как безопасно удалить элемент при обходе?
  • Что делает CopyOnWriteArrayList?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем