Как реализовать свою потокобезопасную коллекцию?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Реализация потокобезопасной коллекции
Потокобезопасная коллекция — это структура данных, которая корректно работает при одновременном доступе из нескольких потоков. Существует несколько подходов к её реализации.
Подход 1: Синхронизация методов
Самый простой способ — синхронизировать все публичные методы:
public class SynchronizedList<T> {
private List<T> items = new ArrayList<>();
public synchronized void add(T item) {
items.add(item);
}
public synchronized T get(int index) {
return items.get(index);
}
}
Плюсы: простая реализация, гарантирует безопасность. Минусы: низкая производительность при конкурировании потоков.
Подход 2: ReentrantLock
Используем явную блокировку:
import java.util.concurrent.locks.ReentrantLock;
public class LockedList<T> {
private List<T> items = new ArrayList<>();
private final ReentrantLock lock = new ReentrantLock();
public void add(T item) {
lock.lock();
try {
items.add(item);
} finally {
lock.unlock();
}
}
}
Плюсы: более гибкая, поддерживает условные переменные. Минусы: требует явного управления блокировкой.
Подход 3: CopyOnWriteArrayList
Для читающих операций, которые преобладают:
CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>();
list.add("element");
String elem = list.get(0);
Плюсы: отлично при много читателях. Минусы: дорогие операции записи.
Подход 4: Segmented Lock
Делим коллекцию на сегменты со своей блокировкой:
public class SegmentedList<T> {
private static final int SEGMENTS = 16;
private List<T>[] segments;
private ReentrantLock[] locks;
public SegmentedList() {
segments = new List[SEGMENTS];
locks = new ReentrantLock[SEGMENTS];
for (int i = 0; i < SEGMENTS; i++) {
segments[i] = new ArrayList<>();
locks[i] = new ReentrantLock();
}
}
}
Рекомендации
В реальных проектах используют готовые классы из java.util.concurrent: ConcurrentHashMap, CopyOnWriteArrayList, ConcurrentLinkedQueue. Они имеют оптимизированные реализации и хорошо протестированы. Выбор подхода зависит от паттерна использования: много читателей или писателей, размер коллекции, требования к производительности.