Sobes.tech
Middle

Aké thread-safe kolekcie poznáš v Jave?

sobes.tech AI

Odpoveď od AI

V Java Collections Framework existujú vlákno-bezpečné kolekcie, implementované dvoma hlavnými spôsobmi:

  1. Synchronizované obálky (Synchronized Wrappers):

    • Obalujú bežné, nevláknovo-bezpečné kolekcie (napríklad ArrayList, HashMap, HashSet).
    • Všetky metódy kolekcie sú synchronizované.
    • Príklad získania synchronizovaných kolekcií:
      // Získanie synchronizovaného zoznamu
      List<String> synchronizedList = Collections.synchronizedList(new ArrayList<>());
      
      // Získanie synchronizovaného množstva
      Set<String> synchronizedSet = Collections.synchronizedSet(new HashSet<>());
      
      // Získanie synchronizovanej mapy
      Map<String, String> synchronizedMap = Collections.synchronizedMap(new HashMap<>());
      
    • Nevýhoda: Nízka výkonnosť pri vysokom stupni paralelizmu, pretože zámok sa uplatňuje na celú kolekciu.
  2. Kolekcie z balíčka java.util.concurrent:

    • Navrhnuté špeciálne pre prácu vo viacvláknovej prostredí.
    • Dosahujú vlákno-bezpečnosť rôznymi mechanizmami (napríklad, jemnozrnná zámka, CAS operácie).
    • Zabezpečujú lepší výkon pri paralelných operáciách v porovnaní so synchronizovanými obálkami.
    • Hlavné príklady:
      • ConcurrentHashMap: Vlákno-bezpečná implementácia Map, ktorá zabezpečuje vysokú priepustnosť pre operácie čítania a zápisu.
      • CopyOnWriteArrayList: Zoznam, ktorý pri modifikácii vytvára novú kópiu základného poľa. Dobré pre kolekcie s častými operáciami čítania a zriedkavými operáciami zápisu.
      • CopyOnWriteArraySet: Podobne ako CopyOnWriteArrayList, ale pre množiny.
      • ConcurrentLinkedQueue: Vlákno-bezpečná, bezzámková implementácia Queue.
      • ConcurrentLinkedDeque: Vlákno-bezpečná, bezzámková implementácia Deque.
      • ConcurrentSkipListMap: Vlákno-bezpečná, škálovateľná implementácia SortedMap.
      • ConcurrentSkipListSet: Vlákno-bezpečná, škálovateľná implementácia SortedSet.
      • Blokujúce fronty (BlockingQueue, BlockingDeque) - napríklad, ArrayBlockingQueue, LinkedBlockingQueue, PriorityBlockingQueue, DelayQueue, SynchronousQueue, LinkedTransferQueue. Používajú sa na koordináciu výrobcov a spotrebiteľov.

Výber medzi synchronizovanými obálkami a kolekciami z java.util.concurrent závisí od konkrétnych požiadaviek na výkon a charakteru použitia vo viacvláknovej prostredí (frekvencia operácií čítania/zápisu, úroveň paralelizmu). Vo väčšine moderných viacvláknových aplikácií je vhodnejšie používať kolekcie z java.util.concurrent.