← Назад к вопросам

Какой аналог ArrayList в Concurrent Collections?

1.0 Junior🔥 131 комментариев
#Soft Skills и карьера#Другое

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Concurrent Collections аналог ArrayList

CopyOnWriteArrayList — это основной аналог ArrayList в пакете java.util.concurrent. Это потокобезопасная коллекция, которая создана специально для многопоточных приложений, где частые чтения значительно превышают количество операций записи.

Основные отличия от ArrayList

ArrayList — это обычная коллекция, которая НЕ потокобезопасна. При одновременном доступе из нескольких потоков может произойти race condition и нарушение целостности данных.

CopyOnWriteArrayList решает эту проблему через механизм "copy-on-write":

  • При каждом изменении (добавление, удаление, изменение элемента) создаётся новая копия внутреннего массива
  • Чтение данных происходит из старой копии без блокировок
  • Запись синхронизируется через внутренний lock
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.List;

public class ConcurrentListExample {
    public static void main(String[] args) {
        List<String> safeList = new CopyOnWriteArrayList<>();
        safeList.add("Item 1");
        safeList.add("Item 2");
        for (String item : safeList) {
            System.out.println(item);
        }
    }
}

Когда использовать CopyOnWriteArrayList

Преимущества:

  • Безопасная итерация — можно перебирать элементы без ConcurrentModificationException
  • Отсутствие deadlock'ов — читатели никогда не блокируются
  • Атомарные операции — каждое изменение гарантировано видно всем потокам
  • Идеально для многочтений — если писатели редки

Недостатки:

  • Высокая стоимость записи — каждое изменение требует копирования всего массива (O(n))
  • Высокое потребление памяти — при частых изменениях создаётся много копий
  • Не подходит для частых обновлений — если часто добавляете/удаляете элементы

Пример потокобезопасной работы

public class ThreadSafeListExample {
    public static void main(String[] args) throws InterruptedException {
        List<Integer> list = new CopyOnWriteArrayList<>();
        Thread writer = new Thread(() -> {
            for (int i = 0; i < 100; i++) {
                list.add(i);
            }
        });
        Thread reader = new Thread(() -> {
            System.out.println("Размер: " + list.size());
        });
        writer.start();
        reader.start();
        writer.join();
        reader.join();
    }
}

Альтернативы

  • Collections.synchronizedList() — синхронизирует весь список
  • Vector — устаревший класс (не используй)
  • Собственная синхронизация — использование synchronized блоков

CopyOnWriteArrayList — лучший выбор для сценариев с частыми чтениями и редкими записями.