Hardcopy-on-write
Чем CopyOnWriteArrayList отличается от synchronizedList?
1Постановка
Разберём, что от вас хотят в этом вопросе и как к нему подступиться на собеседовании.
2Решение
CopyOnWriteArrayList — при каждой записи (add/set/remove) создаёт копию внутреннего массива; читает без synchronization. Iterator — snapshot, не бросает ConcurrentModificationException.
// read-heavy: listeners, config
CopyOnWriteArrayList<Listener> listeners = new CopyOnWriteArrayList<>();
for (Listener l : listeners) { l.onEvent(); } // snapshot, без блокировки
// general-purpose: все методы synchronized
List<String> sync = Collections.synchronizedList(new ArrayList<>());
synchronized (sync) { for (String s : sync) { /* нужен внешний lock */ } }- COW: записи дорогие (O(n) copy), чтение очень быстрое — для read-heavy (10:1+), небольшого размера;
- synchronizedList: чтение блокирует весь список, iterator нужно оборачивать в
synchronized; CopyOnWriteArraySet— set на основе COW list;ConcurrentLinkedQueue— high-throughput queue без блокировок.
3Как отвечать
- Сначала уточните условия и ограничения, покажите аналитическое мышление.
- Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
- Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡
На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.