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

Как реализовать свою потокобезопасную коллекцию?

2.0 Middle🔥 161 комментариев
#Многопоточность#Коллекции

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

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

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

Реализация потокобезопасной коллекции

Потокобезопасная коллекция — это структура данных, которая корректно работает при одновременном доступе из нескольких потоков. Существует несколько подходов к её реализации.

Подход 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. Они имеют оптимизированные реализации и хорошо протестированы. Выбор подхода зависит от паттерна использования: много читателей или писателей, размер коллекции, требования к производительности.

Как реализовать свою потокобезопасную коллекцию? | PrepBro