Где находятся потокобезопасные (thread-safe) коллекции в стандартной библиотеке Java?

«Где находятся потокобезопасные (thread-safe) коллекции в стандартной библиотеке Java?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Потокобезопасные коллекции расположены в пакете java.util.concurrent. Они предназначены для безопасного использования в многопоточных сценариях без необходимости внешней синхронизации с помощью synchronized.

Основные категории и классы:

  • Concurrent Collections (высокопроизводительные):

    • ConcurrentHashMap<K,V> — аналог HashMap. Использует сегментированную блокировку или CAS-операции для высокой степени параллелизма.
    • ConcurrentSkipListMap<K,V> — аналог TreeMap (сортированный).
    • ConcurrentSkipListSet<E> — аналог TreeSet.
    • CopyOnWriteArrayList<E> — список, который создает новую копию массива при каждой модификации. Идеален для сценариев «частое чтение, редкая запись».
    • CopyOnWriteArraySet<E> — реализация Set на основе CopyOnWriteArrayList.
  • Blocking Queues (блокирующие очереди):

    • ArrayBlockingQueue<E> — очередь на массиве с фиксированной емкостью.
    • LinkedBlockingQueue<E> — очередь на связном списке (может быть неограниченной).
    • PriorityBlockingQueue<E> — приоритетная очередь.

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

import java.util.concurrent.ConcurrentHashMap;

ConcurrentHashMap<String, Integer> concurrentMap = new ConcurrentHashMap<>();
// Безопасные операции из множества потоков:
concurrentMap.put("key", 1);
Integer value = concurrentMap.get("key");
concurrentMap.computeIfAbsent("key", k -> 0 + 1); // Атомарная операция

Почему они лучше Collections.synchronizedXXX()? Эти коллекции обеспечивают более высокую производительность за счет более тонких механизмов синхронизации (оптимистичные блокировки, разделение данных), позволяя нескольким потокам читать и даже модифицировать коллекцию одновременно, где это безопасно.