← Назад к вопросам
Какой аналог 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 — лучший выбор для сценариев с частыми чтениями и редкими записями.