Sobes.tech
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:

  1. 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.
  2. 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 van Map, 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 met CopyOnWriteArrayList, maar voor verzamelingen.
      • ConcurrentLinkedQueue: Thread-safe, lock-free implementatie van Queue.
      • ConcurrentLinkedDeque: Thread-safe, lock-free implementatie van Deque.
      • ConcurrentSkipListMap: Schaalbare, thread-safe implementatie van SortedMap.
      • ConcurrentSkipListSet: Schaalbare, thread-safe implementatie van SortedSet.
      • 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.