Что такое CopyOnWriteArrayList в Java?

«Что такое CopyOnWriteArrayList в Java?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

CopyOnWriteArrayList — это потокобезопасная реализация интерфейса List из пакета java.util.concurrent, которая использует стратегию "копирования при записи".

Принцип работы:

  • При каждой операции модификации (добавление, удаление, изменение) создается новая копия внутреннего массива.
  • Операции чтения работают с неизменяемым снимком (snapshot) массива, сделанным на момент начала чтения.

Ключевые особенности:

  • Потокобезопасность для чтения: Не требует синхронизации при итерации или чтении.
  • Итераторы: Предоставляют снимок данных на момент создания итератора и не поддерживают операцию remove().
  • Производительность: Эффективен в сценариях, где операции чтения значительно преобладают над операциями записи.
  • Память: Может потреблять больше памяти из-за частого копирования массива.

Пример использования:

import java.util.concurrent.CopyOnWriteArrayList;

CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>();
list.add("A");
list.add("B");

// Итерация безопасна даже при параллельных модификациях
for (String item : list) {
    System.out.println(item); // Чтение из snapshot
    // list.add("C"); // Эта модификация не повлияет на текущую итерацию
}

Когда использовать: Для часто читаемых, редко изменяемых коллекций (например, списки слушателей событий, кэши конфигураций).