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 подскажет развёрнутый ответ в реальном времени.