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

Когда уместен CopyOnWriteArrayList?

MiddleКоллекции
Коротко

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

  • Чтение без синхронизации, итератор — снимок
  • Запись O(n) под блокировкой
  • Большой список с частыми изменениями — катастрофа по памяти и GC

А ещё Альтернативы: ConcurrentLinkedQueue, synchronized-список, неизменяемая коллекция с атомарной заменой

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

Подробно

Механика прямолинейна: изменение создаёт новую копию внутреннего массива под блокировкой, а читатели работают со старой без всякой синхронизации — отсюда бесплатное чтение и очень дорогая запись, стоимость которой линейна от размера. Классический сценарий — реестр слушателей: подписки происходят редко, а обход при каждом событии. Важное следствие для читателей: итератор работает со снимком на момент создания, поэтому он никогда не бросит ConcurrentModificationException, но и не увидит изменений, сделанных после начала обхода; по этой же причине у него не поддерживается remove. Если записи часты, берут другую структуру — например, ConcurrentLinkedQueue или ConcurrentHashMap, в зависимости от задачи.

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

  • Механика копирования при записи.
  • Когда уместен.

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

  • Использовать эту коллекцию как универсальный потокобезопасный список.
  • Рассчитывать, что итератор увидит свежие изменения.

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

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

Показать варианты и ответ
  • ✓Когда чтений во много раз больше, чем записей, а коллекция невелика — например, список слушателей события
  • ✗Когда запись идёт постоянно, а чтения редки
  • ✗Когда нужен потокобезопасный список с быстрой вставкой в середину
  • ✗Когда коллекция очень большая и часто изменяется

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

  • Почему итератор этой коллекции не бросает ConcurrentModificationException?
  • Что выбрать при частых записях из нескольких потоков?

Разбор темы

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

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

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

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

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