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:
-
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.
- Umhüllen gewöhnliche, nicht thread-sichere Sammlungen (z.B.
-
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 vonMap, 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 wieCopyOnWriteArrayList, aber für Mengen.ConcurrentLinkedQueue: Thread-sichere, lockfreie Implementierung vonQueue.ConcurrentLinkedDeque: Thread-sichere, lockfreie Implementierung vonDeque.ConcurrentSkipListMap: Skalierbare, thread-sichere Implementierung vonSortedMap.ConcurrentSkipListSet: Skalierbare, thread-sichere Implementierung vonSortedSet.- 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.