Middle
Welke thread-safe collecties ken je in Java?
sobes.tech AI
Antwoord van AI
In Java Collections Framework bestaan er thread-safe collecties, geïmplementeerd op twee hoofdmanieren:
-
Gesynchroniseerde wrappers:
- Omwikkelen gewone, niet-thread-safe collecties (bijvoorbeeld
ArrayList,HashMap,HashSet). - Alle methoden van de collectie zijn gesynchroniseerd.
- Voorbeeld van het verkrijgen van gesynchroniseerde collecties:
// Verkrijg een gesynchroniseerde lijst List<String> synchronizedList = Collections.synchronizedList(new ArrayList<>()); // Verkrijg een gesynchroniseerd set Set<String> synchronizedSet = Collections.synchronizedSet(new HashSet<>()); // Verkrijg een gesynchroniseerde kaart Map<String, String> synchronizedMap = Collections.synchronizedMap(new HashMap<>()); - Nadeel: Lage prestaties bij hoge mate van parallelisme, omdat de lock op de hele collectie plaatsvindt.
- Omwikkelen gewone, niet-thread-safe collecties (bijvoorbeeld
-
Collecties uit het
java.util.concurrent-pakket:- Speciaal ontworpen voor gebruik in multithread-omgevingen.
- Bereiken threadveiligheid via verschillende mechanismen (bijvoorbeeld fijnmazige locking, CAS-operaties).
- Bieden betere prestaties bij parallelle operaties in vergelijking met gesynchroniseerde wrappers.
- Belangrijkste voorbeelden:
ConcurrentHashMap: Thread-safe implementatie vanMap, die hoge doorvoer biedt voor lees- en schrijfbewerkingen.CopyOnWriteArrayList: Lijst die bij modificatie een nieuwe kopie van de onderliggende array maakt. Geschikt voor collecties met frequente lees- en zeldzame schrijfbewerkingen.CopyOnWriteArraySet: Vergelijkbaar metCopyOnWriteArrayList, maar voor verzamelingen.ConcurrentLinkedQueue: Thread-safe, lock-free implementatie vanQueue.ConcurrentLinkedDeque: Thread-safe, lock-free implementatie vanDeque.ConcurrentSkipListMap: Schaalbare, thread-safe implementatie vanSortedMap.ConcurrentSkipListSet: Schaalbare, thread-safe implementatie vanSortedSet.- Blokkerende wachtrijen (
BlockingQueue,BlockingDeque) - bijvoorbeeld,ArrayBlockingQueue,LinkedBlockingQueue,PriorityBlockingQueue,DelayQueue,SynchronousQueue,LinkedTransferQueue. Worden gebruikt voor coördinatie tussen producenten en consumenten.
De keuze tussen gesynchroniseerde wrappers en java.util.concurrent-collecties hangt af van de specifieke prestatie-eisen en het gebruikscharakter in een multithread-omgeving (lees/schrijffrequentie, parallelisme). In de meeste moderne multithread-toepassingen is het aan te raden om collecties uit java.util.concurrent te gebruiken.