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:
-
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.
- Obalujú bežné, nevláknovo-bezpečné kolekcie (napríklad
-
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áciaMap, 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 akoCopyOnWriteArrayList, ale pre množiny.ConcurrentLinkedQueue: Vlákno-bezpečná, bezzámková implementáciaQueue.ConcurrentLinkedDeque: Vlákno-bezpečná, bezzámková implementáciaDeque.ConcurrentSkipListMap: Vlákno-bezpečná, škálovateľná implementáciaSortedMap.ConcurrentSkipListSet: Vlákno-bezpečná, škálovateľná implementáciaSortedSet.- 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.