Какие потокобезопасные коллекции (Concurrent Collections) вы знаете в Java?

«Какие потокобезопасные коллекции (Concurrent Collections) вы знаете в Java?» — вопрос из категории Java Core, который задают на 22% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Потокобезопасные коллекции из пакета java.util.concurrent:

Коллекция Назначение и особенности
ConcurrentHashMap<K,V> Потокобезопасная Map. Использует сегментирование блокировок (в старых версиях) или CAS-операции (с Java 8), что позволяет высокий параллелизм при чтении и записи.
CopyOnWriteArrayList<E> List, где каждая модификация создает новую копию внутреннего массива. Идеален для сценариев «частое чтение, редкая запись» (например, список слушателей событий).
CopyOnWriteArraySet<E> Реализация Set на основе CopyOnWriteArrayList.
ConcurrentLinkedQueue<E> Неблокирующая, потокобезопасная очередь на основе связанных узлов и алгоритма CAS.
ConcurrentSkipListMap<K,V> Потокобезопасная, отсортированная Map на основе skip-list.
ConcurrentSkipListSet<E> Потокобезопасный, отсортированный Set на основе ConcurrentSkipListMap.

Блокирующие очереди (реализуют BlockingQueue):

  • ArrayBlockingQueue — очередь на массиве фиксированного размера.
  • LinkedBlockingQueue — очередь на связном списке, может иметь ограничение или быть неограниченной.
  • PriorityBlockingQueue — приоритетная блокирующая очередь.
  • SynchronousQueue — очередь, которая передает элементы непосредственно от производителя к потребителю.

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

import java.util.concurrent.ConcurrentHashMap;

ConcurrentHashMap<String, Integer> scores = new ConcurrentHashMap<>();
// Потокобезопасные операции
scores.put("Alice", 100);
scores.computeIfPresent("Alice", (k, v) -> v + 50); // Alice: 150