Kursinhalt
Multithreading in Java
Multithreading in Java
Beispiele für die Verwendung von Collections-Methoden
Hinweis
Heute werden wir hauptsächlich Methoden betrachten, die helfen, thread-sichere Sammlungen zu erstellen.
Methoden für Sammlungen
Hier sind einige wichtige Methoden, die von der Klasse bereitgestellt werden, um synchronisierte Collections
Sammlungen zu erstellen:
synchronizedList(List<T> list)
: Gibt eine synchronisierte (thread-sichere) Liste zurück, die denselben Vertrag wie die übergebene Liste unterstützt.
Main
List<Object> listSync = Collections.synchronizedList(new ArrayList<>());
synchronizedSet(Set<T> set)
: Gibt eine synchronisierte (thread-sichere) Menge zurück, die denselben Vertrag wie die übergebene Menge unterstützt.
Main
Set<Object> setSync = Collections.synchronizedSet(new HashSet<>());
synchronizedMap(Map<K, V> m)
: Gibt eine synchronisierte (thread-sichere) Karte zurück, die denselben Vertrag wie die übergebene Karte unterstützt.
Main
Map<Object, Object> mapSync = Collections.synchronizedMap(new HashMap<>());
unmodifiableList(List<? extends T> list)
: Gibt eine unveränderliche Liste zurück, die dieselben Elemente wie die angegebene Liste enthält.
Main
package com.example; import java.util.Collections; import java.util.List; import java.util.ArrayList; public class Main { public static void main(String[] args) { List<Integer> unmodifiableList = Collections.unmodifiableList(new ArrayList<>(List.of(1,2,3))); System.out.println(unmodifiableList); // output [1,2,3] unmodifiableList.add(4); // throw exception `UnsupportedOperationException` } }
unmodifiableMap(Map<? extends K, ? extends V> m)
: Gibt eine unveränderliche Karte zurück, die die gleichen Zuordnungen wie die angegebene Karte enthält.
Main
package com.example; import java.util.Collections; import java.util.Map; import java.util.HashMap; public class Main { public static void main(String[] args) { Map<Integer, Integer> unmodifiableMap = Collections.unmodifiableMap(new HashMap<>()); unmodifiableMap.put(1, 2); // exception `UnsupportedOperationException` } }
unmodifiableSet(Set<? extends T> set)
: Gibt eine unveränderliche Menge zurück, die die gleichen Elemente wie die angegebene Menge enthält.
Main
package com.example; import java.util.Collections; import java.util.Set; import java.util.HashSet; public class Main { public static void main(String[] args) { Set<Integer> unmodifiableSet = Collections.unmodifiableSet(new HashSet<>()); unmodifiableSet.add(4); // exception `UnsupportedOperationException` } }
Was ist dann der Unterschied zwischen dem Erstellen synchronisierter Sammlungen durch normale Implementierungen (die in den vorherigen Kapiteln besprochen wurden) und der Verwendung von Collections
-Methoden?
Schauen wir uns den Unterschied anhand einer Map
-Sammlung als Beispiel an
Unterschiede zwischen der Verwendung von ConcurrentHashMap und synchronizedMap()
ConcurrentHashMap
verwendet eine fortschrittliche Methode, die als Lock-Splitting bekannt ist, bei der die Map in Segmente unterteilt wird und Operationen nur auf Segmentebene synchronisiert werden. Dieser Ansatz ermöglicht es mehreren Threads, gleichzeitig Daten in verschiedenen Segmenten der Map zu lesen und zu schreiben, was die Parallelität und Leistung verbessert.
Die Methode synchronizedMap()
umhüllt die ursprüngliche Karte in ein synchronisiertes Proxy-Objekt. Alle Methoden dieses Proxy-Objekts sind synchronisiert, um Thread-Sicherheit zu gewährleisten. Diese Vorgehensweise kann jedoch die Leistung in einer Multithread-Umgebung aufgrund der hohen Sperrfrequenz beeinträchtigen.
Zum Beispiel, wenn ConcurrentHashMap
in verschiedene Buckets schreibt, werden sich die Threads nicht gegenseitig blockieren. Wenn jedoch ein Bucket von 2 Threads zugegriffen wird, wird einer von ihnen warten. Andererseits, wenn die Sammlung über synchronizedMap()
erstellt wird, wird nur 1 Thread Zugriff auf alle Buckets haben, und die gesamte Karte ist blockiert.
Das bedeutet, dass bis ein Thread seine Arbeit beendet, andere Threads nicht eintreten können. Infolgedessen werden Operationen in ConcurrentHashMap
einfach schneller ausgeführt.
Auch in Collections gibt es andere Methoden für die bequeme Arbeit mit Collections:
Hinweis
Die
Collections
-Klasse bietet bequeme Methoden für die Arbeit mit Collections in Java, die häufig verwendete Operationen vereinfachen. Synchronisierte Collections, die überCollections
-Methoden erstellt werden, sind nützlich für die Thread-Sicherheit, aber für komplexere Multithreading-Aufgaben ist es besser, Collections aus demjava.util.concurrent
-Paket zu verwenden.
1. Welche Methode in der Collections-Klasse wird verwendet, um eine unveränderliche Liste zu erstellen?
2. Welche der folgenden Methoden in der Collections
-Klasse gibt eine thread-sichere Map zurück?
3. Was ist der Unterschied zwischen ConcurrentHashMap und synchronizedMap?
Danke für Ihr Feedback!