Beispiele Für Die Verwendung Von Collections-Methoden
Heute betrachten wir hauptsächlich Methoden, die dabei helfen, threadsichere Collections zu erstellen.
Collections-Methoden
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.java
1List<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.java
1Set<Object> setSync = Collections.synchronizedSet(new HashSet<>());
synchronizedMap(Map<K, V> m): Gibt eine synchronisierte (thread-sichere) Map zurück, die denselben Vertrag wie die übergebene Map unterstützt.
Main.java
1Map<Object, Object> mapSync = Collections.synchronizedMap(new HashMap<>());
unmodifiableList(List<? extends T> list): Gibt eine unveränderliche Liste zurück, die die gleichen Elemente wie die angegebene Liste enthält.
Main.java
123456789101112131415package 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 Map zurück, die die gleichen Zuordnungen wie die angegebene Map enthält.
Main.java
12345678910111213package 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.java
12345678910111213package 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 also der Unterschied zwischen dem Erstellen synchronisierter Collections durch normale Implementierungen (wie in den vorherigen Kapiteln besprochen) und der Verwendung von Collections-Methoden?
Betrachten wir den Unterschied am Beispiel einer Map-Collection
Unterschiede zwischen ConcurrentHashMap und synchronizedMap()
ConcurrentHashMap verwendet eine fortschrittliche Methode namens Lock Splitting, bei der die Map in Segmente unterteilt 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 Nebenläufigkeit und Leistung verbessert.
Die Methode synchronizedMap() umschließt die ursprüngliche Map in ein synchronisiertes Proxy-Objekt. Alle Methoden dieses Proxy-Objekts sind synchronisiert, was die Thread-Sicherheit gewährleistet. Dieser Ansatz kann jedoch die Leistung in einer Multithread-Umgebung aufgrund der hohen Sperrfrequenz verringern.
Beispielsweise blockieren sich Threads bei ConcurrentHashMap nicht gegenseitig, wenn sie in verschiedene Buckets schreiben. Greifen jedoch 2 Threads auf denselben Bucket zu, muss einer warten. Wird die Collection hingegen über synchronizedMap() erstellt, erhält nur 1 Thread Zugriff auf alle Buckets, und die gesamte Map ist gesperrt.
Das bedeutet, dass andere Threads erst dann zugreifen können, wenn ein Thread seine Arbeit beendet hat. Dadurch werden Operationen in ConcurrentHashMap einfach schneller ausgeführt.
Außerdem gibt es in Collections weitere Methoden für die komfortable Arbeit mit Collections:
Die Klasse Collections stellt praktische Methoden für die Arbeit mit Collections in Java bereit und vereinfacht häufig verwendete Operationen. Synchronisierte Collections, die über Collections-Methoden erstellt werden, sind nützlich für die Threadsicherheit. Für komplexere Multithreading-Aufgaben ist es jedoch besser, Collections aus dem Paket java.util.concurrent zu verwenden.
1. Welche Methode der Klasse Collections wird verwendet, um eine unveränderliche Liste zu erstellen?
2. Welche der folgenden Methoden der Klasse Collections gibt eine threadsichere Map zurück?
3. Was ist der Unterschied zwischen ConcurrentHashMap und synchronizedMap?
Danke für Ihr Feedback!
Fragen Sie AI
Fragen Sie AI
Fragen Sie alles oder probieren Sie eine der vorgeschlagenen Fragen, um unser Gespräch zu beginnen
Awesome!
Completion rate improved to 3.33
Beispiele Für Die Verwendung Von Collections-Methoden
Swipe um das Menü anzuzeigen
Heute betrachten wir hauptsächlich Methoden, die dabei helfen, threadsichere Collections zu erstellen.
Collections-Methoden
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.java
1List<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.java
1Set<Object> setSync = Collections.synchronizedSet(new HashSet<>());
synchronizedMap(Map<K, V> m): Gibt eine synchronisierte (thread-sichere) Map zurück, die denselben Vertrag wie die übergebene Map unterstützt.
Main.java
1Map<Object, Object> mapSync = Collections.synchronizedMap(new HashMap<>());
unmodifiableList(List<? extends T> list): Gibt eine unveränderliche Liste zurück, die die gleichen Elemente wie die angegebene Liste enthält.
Main.java
123456789101112131415package 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 Map zurück, die die gleichen Zuordnungen wie die angegebene Map enthält.
Main.java
12345678910111213package 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.java
12345678910111213package 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 also der Unterschied zwischen dem Erstellen synchronisierter Collections durch normale Implementierungen (wie in den vorherigen Kapiteln besprochen) und der Verwendung von Collections-Methoden?
Betrachten wir den Unterschied am Beispiel einer Map-Collection
Unterschiede zwischen ConcurrentHashMap und synchronizedMap()
ConcurrentHashMap verwendet eine fortschrittliche Methode namens Lock Splitting, bei der die Map in Segmente unterteilt 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 Nebenläufigkeit und Leistung verbessert.
Die Methode synchronizedMap() umschließt die ursprüngliche Map in ein synchronisiertes Proxy-Objekt. Alle Methoden dieses Proxy-Objekts sind synchronisiert, was die Thread-Sicherheit gewährleistet. Dieser Ansatz kann jedoch die Leistung in einer Multithread-Umgebung aufgrund der hohen Sperrfrequenz verringern.
Beispielsweise blockieren sich Threads bei ConcurrentHashMap nicht gegenseitig, wenn sie in verschiedene Buckets schreiben. Greifen jedoch 2 Threads auf denselben Bucket zu, muss einer warten. Wird die Collection hingegen über synchronizedMap() erstellt, erhält nur 1 Thread Zugriff auf alle Buckets, und die gesamte Map ist gesperrt.
Das bedeutet, dass andere Threads erst dann zugreifen können, wenn ein Thread seine Arbeit beendet hat. Dadurch werden Operationen in ConcurrentHashMap einfach schneller ausgeführt.
Außerdem gibt es in Collections weitere Methoden für die komfortable Arbeit mit Collections:
Die Klasse Collections stellt praktische Methoden für die Arbeit mit Collections in Java bereit und vereinfacht häufig verwendete Operationen. Synchronisierte Collections, die über Collections-Methoden erstellt werden, sind nützlich für die Threadsicherheit. Für komplexere Multithreading-Aufgaben ist es jedoch besser, Collections aus dem Paket java.util.concurrent zu verwenden.
1. Welche Methode der Klasse Collections wird verwendet, um eine unveränderliche Liste zu erstellen?
2. Welche der folgenden Methoden der Klasse Collections gibt eine threadsichere Map zurück?
3. Was ist der Unterschied zwischen ConcurrentHashMap und synchronizedMap?
Danke für Ihr Feedback!