Java Core middle

ConcurrentModificationException: причина и решение?

Ответ

Модификация коллекции во время итерации не через итератор (fail-fast, в том числе в одном потоке — например, list.remove в for-each). modCount-счётчик: при следующем next() проверяется. Решения: Iterator.remove(), CopyOnWriteArrayList, ConcurrentHashMap, removeIf() (Java 8+).

Разбор: CME — это fail-fast реакция на структурную модификацию коллекции в обход итератора: итератор хранит ожидаемое значение modCount и сверяет его в next(). Исключение легко получить и в одном потоке (например, list.remove внутри for-each), поэтому решения — Iterator.remove(), removeIf(), CopyOnWriteArrayList или ConcurrentHashMap, а не просто внешняя синхронизация или увеличение capacity.

Хочешь так же по своей компании — с вопросами по грейдам и задачами? Закажи гайд или забери свежее в Telegram.

Заказать гайд Пройти тест
новые гайды и свежие вопросы с собесов — первыми в Telegram Смотреть гайды Подписаться