Middle
Кои потокобезопасни колекции познаваш в Java?
sobes.tech AI
Отговор от AI
В Java Collections Framework съществуват потокобезопасни колекции, реализирани по два основни начина:
-
Синхронизирани обвивки (Synchronized Wrappers):
- Обвиват обикновени, непотокобезопасни колекции (например
ArrayList,HashMap,HashSet). - Всички методи на колекцията са синхронизирани.
- Пример за получаване на синхронизирани колекции:
// Получаване на синхронизиран списък List<String> synchronizedList = Collections.synchronizedList(new ArrayList<>()); // Получаване на синхронизирана множество Set<String> synchronizedSet = Collections.synchronizedSet(new HashSet<>()); // Получаване на синхронизирана карта Map<String, String> synchronizedMap = Collections.synchronizedMap(new HashMap<>()); - Недостатък: Ниска производителност при висок паралелизъм, тъй като блокировката е върху цялата колекция.
- Обвиват обикновени, непотокобезопасни колекции (например
-
Колекции от пакета
java.util.concurrent:- Специално разработени за работа в многопоточна среда.
- Постигат потокобезопасност чрез различни механизми (например, финозърнеста блокировка, CAS операции).
- Осигуряват по-добра производителност при паралелни операции в сравнение със синхронизирани обвивки.
- Основни примери:
ConcurrentHashMap: Потокобезопасна реализация наMap, осигуряваща висока пропускателна способност за операции по четене и писане.CopyOnWriteArrayList: Списък, който при модификация създава ново копие на основния масив. Добре подходящ за колекции с чести операции по четене и редки операции по писане.CopyOnWriteArraySet: Аналогично наCopyOnWriteArrayList, но за множества.ConcurrentLinkedQueue: Потокобезопасна, беззъбна реализация наQueue.ConcurrentLinkedDeque: Потокобезопасна, беззъбна реализация наDeque.ConcurrentSkipListMap: Потокобезопасна, скалируемо реализиранаSortedMap.ConcurrentSkipListSet: Потокобезопасна, скалируемо реализиранаSortedSet.- Блокиращи опашки (
BlockingQueue,BlockingDeque) - например,ArrayBlockingQueue,LinkedBlockingQueue,PriorityBlockingQueue,DelayQueue,SynchronousQueue,LinkedTransferQueue. Използват се за координация на производители и потребители.
Изборът между синхронизирани обвивки и колекции от java.util.concurrent зависи от конкретните изисквания към производителността и характера на използването в многопоточна среда (честота на операции по четене/запис, ниво на паралелизъм). В повечето съвременни многопоточни приложения е по-подходящо да се използват колекции от java.util.concurrent.