Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lernen Beispiele für die Verwendung von Collections-Methoden | Synchronisierte Sammlungen
Multithreading in Java
course content

Kursinhalt

Multithreading in Java

Multithreading in Java

1. Grundlagen der Multithread-Verarbeitung
2. Synchronisierte Sammlungen
3. Hochrangige Synchronisationsmechanismen
4. Best Practices für Multithreading

book
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.

java

Main

copy
1
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.

java

Main

copy
1
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.

java

Main

copy
1
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.

java

Main

copy
123456789101112131415
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.

java

Main

copy
12345678910111213
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.

java

Main

copy
12345678910111213
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 über Collections-Methoden erstellt werden, sind nützlich für die Thread-Sicherheit, aber für komplexere Multithreading-Aufgaben ist es besser, Collections aus dem java.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?

Welche Methode in der Collections-Klasse wird verwendet, um eine unveränderliche Liste zu erstellen?

Welche Methode in der Collections-Klasse wird verwendet, um eine unveränderliche Liste zu erstellen?

Wählen Sie die richtige Antwort aus

Welche der folgenden Methoden in der `Collections`-Klasse gibt eine **thread-sichere** Map zurück?

Welche der folgenden Methoden in der Collections-Klasse gibt eine thread-sichere Map zurück?

Wählen Sie die richtige Antwort aus

Was ist der Unterschied zwischen ConcurrentHashMap und synchronizedMap?

Was ist der Unterschied zwischen ConcurrentHashMap und synchronizedMap?

Wählen Sie die richtige Antwort aus

War alles klar?

Wie können wir es verbessern?

Danke für Ihr Feedback!

Abschnitt 2. Kapitel 8
We're sorry to hear that something went wrong. What happened?
some-alt