Sobes.tech
Middle

Кои потокобезопасни колекции познаваш в Java?

sobes.tech AI

Отговор от AI

В Java Collections Framework съществуват потокобезопасни колекции, реализирани по два основни начина:

  1. Синхронизирани обвивки (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<>());
      
    • Недостатък: Ниска производителност при висок паралелизъм, тъй като блокировката е върху цялата колекция.
  2. Колекции от пакета 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.