Sobes.tech
Middle

Welche thread-sicheren Sammlungen kennst du in Java?

sobes.tech KI

Antwort von AI

Im Java Collections Framework gibt es thread-sichere Sammlungen, die auf zwei Hauptarten implementiert sind:

  1. Synchronisierte Wrapper:

    • Umhüllen gewöhnliche, nicht thread-sichere Sammlungen (z.B. ArrayList, HashMap, HashSet).
    • Alle Methoden der Sammlung sind synchronisiert.
    • Beispiel für das Erstellen synchronisierter Sammlungen:
      // Synchronisierte Liste
      List<String> synchronizedList = Collections.synchronizedList(new ArrayList<>());
      
      // Synchronisierter Set
      Set<String> synchronizedSet = Collections.synchronizedSet(new HashSet<>());
      
      // Synchronisierte Map
      Map<String, String> synchronizedMap = Collections.synchronizedMap(new HashMap<>());
      
    • Nachteil: Geringe Leistung bei hohem Parallelitätsgrad, da die Sperre auf die gesamte Sammlung wirkt.
  2. Sammlungen aus dem Paket java.util.concurrent:

    • Speziell für den Einsatz in Multi-Thread-Umgebungen entwickelt.
    • Erreichen Thread-Sicherheit durch verschiedene Mechanismen (z.B. feinkörnige Sperren, CAS-Operationen).
    • Bieten bessere Leistung bei parallelen Operationen im Vergleich zu synchronisierten Wrappers.
    • Hauptbeispiele:
      • ConcurrentHashMap: Thread-sichere Implementierung von Map, die hohe Durchsatzraten bei Lese- und Schreiboperationen ermöglicht.
      • CopyOnWriteArrayList: Liste, die bei Modifikation eine Kopie des zugrunde liegenden Arrays erstellt. Gut geeignet für Sammlungen mit häufigen Lese- und seltenen Schreiboperationen.
      • CopyOnWriteArraySet: Ähnlich wie CopyOnWriteArrayList, aber für Mengen.
      • ConcurrentLinkedQueue: Thread-sichere, lockfreie Implementierung von Queue.
      • ConcurrentLinkedDeque: Thread-sichere, lockfreie Implementierung von Deque.
      • ConcurrentSkipListMap: Skalierbare, thread-sichere Implementierung von SortedMap.
      • ConcurrentSkipListSet: Skalierbare, thread-sichere Implementierung von SortedSet.
      • Blockierende Warteschlangen (BlockingQueue, BlockingDeque) - z.B. ArrayBlockingQueue, LinkedBlockingQueue, PriorityBlockingQueue, DelayQueue, SynchronousQueue, LinkedTransferQueue. Werden zur Koordination von Produzenten und Konsumenten verwendet.

Die Wahl zwischen synchronisierten Wrappers und java.util.concurrent-Sammlungen hängt von den spezifischen Leistungsanforderungen und dem Nutzungskontext in Multi-Thread-Umgebungen ab (Häufigkeit der Lese-/Schreiboperationen, Parallelitätsgrad). In den meisten modernen Multi-Thread-Anwendungen sind Sammlungen aus java.util.concurrent vorzuziehen.