Ответ
Потокобезопасные коллекции расположены в пакете 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()? Эти коллекции обеспечивают более высокую производительность за счет более тонких механизмов синхронизации (оптимистичные блокировки, разделение данных), позволяя нескольким потокам читать и даже модифицировать коллекцию одновременно, где это безопасно.