Когда уместен CopyOnWriteArrayList?
Каждая запись копирует весь массив — оправдано только при подавляющем преобладании чтений и небольшом размере: реестр слушателей, конфигурация.
- Чтение без синхронизации, итератор — снимок
- Запись O(n) под блокировкой
- Большой список с частыми изменениями — катастрофа по памяти и GC
А ещё Альтернативы: ConcurrentLinkedQueue, synchronized-список, неизменяемая коллекция с атомарной заменой
Подробно
Механика прямолинейна: изменение создаёт новую копию внутреннего массива под блокировкой, а читатели работают со старой без всякой синхронизации — отсюда бесплатное чтение и очень дорогая запись, стоимость которой линейна от размера. Классический сценарий — реестр слушателей: подписки происходят редко, а обход при каждом событии. Важное следствие для читателей: итератор работает со снимком на момент создания, поэтому он никогда не бросит ConcurrentModificationException, но и не увидит изменений, сделанных после начала обхода; по этой же причине у него не поддерживается remove. Если записи часты, берут другую структуру — например, ConcurrentLinkedQueue или ConcurrentHashMap, в зависимости от задачи.
Что хотят услышать
- Механика копирования при записи.
- Когда уместен.
Частые ошибки
- Использовать эту коллекцию как универсальный потокобезопасный список.
- Рассчитывать, что итератор увидит свежие изменения.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗Когда нужен потокобезопасный список с быстрой вставкой в середину
- ✗Когда запись идёт постоянно, а чтения редки
- ✗Когда коллекция очень большая и часто изменяется
- ✓Когда чтений намного больше записей, а список невелик
Что спросят дальше
- Почему итератор этой коллекции не бросает ConcurrentModificationException?
- Что выбрать при частых записях из нескольких потоков?
Разбор темы
- Конкурентные коллекции
ConcurrentHashMap без сегментов (CAS + блокировка бакета), запрет null, CopyOnWriteArrayList и BlockingQueue.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.