Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lernen Copy-On-Write-Sammlung | Synchronisierte Collections
Quizzes & Challenges
Quizzes
Challenges
/
Multithreading in Java

bookCopy-On-Write-Sammlung

Wir haben gemeinsam viele synchronisierte Collections untersucht, und wenn Sie die anderen gemeistert haben, wird Ihnen diese noch einfacher erscheinen.

Praxisbeispiel

Eine Webanwendung, die CopyOnWriteArrayList verwendet, um Event-Abonnenten zu speichern. Mehrere Threads können gleichzeitig eine Liste der aktuellen Abonnenten abrufen, um sie über Änderungen zu benachrichtigen, während andere Threads Abonnenten hinzufügen oder entfernen können.

Unterschiede zu anderen Typen

CopyOnWrite-Collections erstellen bei jeder Änderung eine Kopie der Collection, wodurch Leseoperationen nicht durch Datenänderungen blockiert werden. Dies gewährleistet Thread-Sicherheit für Lesezugriffe, während Schreiboperationen nicht thread-sicher sind, da sie auf einer separaten Kopie der Collection erfolgen.

CopyOnWrite-Ansichten:

Note
Hinweis

Wie auf dem Bild zu sehen ist, wird beim Hinzufügen eines neuen Elements eine Kopie dieser Datenstruktur erstellt. Alle Threads, die vor der Änderung mit dieser Collection gearbeitet haben, setzen ihre Arbeit ohne Probleme fort, da sich diese Änderungen nicht auf die von ihnen verwendete CopyOnWrite-Kopie auswirken!

CopyOnWriteArraySet

CopyOnWriteArraySet ist eine threadsichere Implementierung einer Menge, die auf CopyOnWriteArrayList basiert. Die Threadsicherheit wird gewährleistet, indem bei jeder Änderung, wie dem Hinzufügen oder Entfernen von Elementen, eine neue Kopie der Basismenge erstellt wird.

Dieser Ansatz ist besonders nützlich, wenn die Menge häufig gelesen und selten verändert wird, da er allen Threads eine konsistente Ansicht der Menge bietet, ohne dass eine Synchronisierung erforderlich ist.

CopyOnWriteArrayList

CopyOnWriteArrayList ist eine threadsichere Variante von ArrayList, die Threadsicherheit gewährleistet, indem bei jeder Änderung eine neue Kopie des zugrunde liegenden Arrays erstellt wird.

Dieses Design bietet einen fehlertoleranten Iterator, der keine ConcurrentModificationException auslöst, da er auf einem Schnappschuss des Arrays arbeitet, der zum Zeitpunkt der Erstellung des Iterators aufgenommen wurde. Am besten geeignet für Situationen, in denen Leseoperationen deutlich häufiger als Schreiboperationen auftreten, da der Aufwand für das Kopieren des gesamten Arrays bei jedem Schreibvorgang erheblich sein kann.

Praktisches Anwendungsbeispiel

Methoden der CopyOnWrite-Kollektion

addIfAbsent(E e): Fügt ein Element zur Liste hinzu, nur wenn es noch nicht in der Liste/Mehrfachliste vorhanden ist.

Main.java

Main.java

copy
123456789101112131415161718192021
package com.example; import java.util.concurrent.CopyOnWriteArrayList; public class Main { public static void main(String[] args) { CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>(); list.add("apple"); list.add("banana"); // Attempt to add a duplicate element list.addIfAbsent("apple"); // This will not add "apple" again // Adding a new element list.addIfAbsent("orange"); // This will add "orange" System.out.println(list); // Output: [apple, banana, orange] } }

In diesem Beispiel wird „apple“ nicht erneut hinzugefügt, da es bereits in der Liste vorhanden ist. Die Methode addIfAbsent() verhindert doppelte Einträge und stellt die Eindeutigkeit der Elemente sicher.

addAllAbsent(Collection<? extends E> c): Fügt alle Elemente aus der angegebenen Collection zur Liste/Mehrfachliste hinzu und ignoriert bereits vorhandene Elemente.

Main.java

Main.java

copy
12345678910111213141516171819202122
package com.example; import java.util.Arrays; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; public class Main { public static void main(String[] args) { CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>(); list.add("apple"); list.add("banana"); List<String> newFruits = Arrays.asList("banana", "cherry", "date"); // Adding elements from the collection, ignoring duplicates list.addAllAbsent(newFruits); System.out.println(list); // Output: [apple, banana, cherry, date] } }

In diesem Beispiel ist "banana" bereits in der Liste vorhanden, daher wird addAllAbsent() sie nicht erneut hinzufügen. Die Methode stellt sicher, dass nur eindeutige Elemente aus der bereitgestellten Sammlung zur Liste hinzugefügt werden.

Note
Hinweis

Alle anderen Methoden der CopyOnWrite-Sammlungen ähneln denen ihrer übergeordneten Sammlungen; sie kopieren einfach den Zustand der Sammlung, wann immer Änderungen vorgenommen werden.

Einschränkungen und Vorteile

😔Einschränkungen:

CopyOnWrite-Sammlungen weisen erhebliche Einschränkungen auf. Sie verursachen einen Speicheraufwand, da bei jeder Änderung eine neue Kopie der Sammlung erstellt wird, was beträchtlich sein kann. Dieses Design macht sie weniger geeignet für Szenarien, in denen häufige Datenänderungen erforderlich sind.

💪Vorteile:

Andererseits bieten CopyOnWrite-Sammlungen bedeutende Vorteile. Sie sind äußerst effizient beim Lesen von Daten in einer multithreaded Umgebung. Diese Sammlungen zeigen eine hervorragende Leistung in Situationen, in denen Leseoperationen deutlich häufiger als Schreiboperationen auftreten, was sie zu einer ausgezeichneten Wahl für solche Anwendungsfälle macht.

Note
Hinweis

Aufgrund des Kopierens bei jeder Änderung können CopyOnWrite-Sammlungen mehr Speicher verbrauchen und sind nicht für Szenarien mit häufigen Schreiboperationen geeignet. Sie sind am effektivsten, wenn Leseoperationen gegenüber Schreiboperationen überwiegen.

1. Was passiert, wenn die Methode addIfAbsent(E e) in CopyOnWriteArrayList aufgerufen wird?

2. Warum sind CopyOnWrite-Sammlungen besonders für Szenarien mit häufigen Lesezugriffen und seltenen Datenänderungen geeignet?

question mark

Was passiert, wenn die Methode addIfAbsent(E e) in CopyOnWriteArrayList aufgerufen wird?

Select the correct answer

question mark

Warum sind CopyOnWrite-Sammlungen besonders für Szenarien mit häufigen Lesezugriffen und seltenen Datenänderungen geeignet?

Select the correct answer

War alles klar?

Wie können wir es verbessern?

Danke für Ihr Feedback!

Abschnitt 2. Kapitel 7

Fragen Sie AI

expand

Fragen Sie AI

ChatGPT

Fragen Sie alles oder probieren Sie eine der vorgeschlagenen Fragen, um unser Gespräch zu beginnen

Suggested prompts:

What are some common use cases for CopyOnWrite collections?

Can you explain the main differences between CopyOnWriteArrayList and CopyOnWriteArraySet?

When should I avoid using CopyOnWrite collections?

Awesome!

Completion rate improved to 3.33

bookCopy-On-Write-Sammlung

Swipe um das Menü anzuzeigen

Wir haben gemeinsam viele synchronisierte Collections untersucht, und wenn Sie die anderen gemeistert haben, wird Ihnen diese noch einfacher erscheinen.

Praxisbeispiel

Eine Webanwendung, die CopyOnWriteArrayList verwendet, um Event-Abonnenten zu speichern. Mehrere Threads können gleichzeitig eine Liste der aktuellen Abonnenten abrufen, um sie über Änderungen zu benachrichtigen, während andere Threads Abonnenten hinzufügen oder entfernen können.

Unterschiede zu anderen Typen

CopyOnWrite-Collections erstellen bei jeder Änderung eine Kopie der Collection, wodurch Leseoperationen nicht durch Datenänderungen blockiert werden. Dies gewährleistet Thread-Sicherheit für Lesezugriffe, während Schreiboperationen nicht thread-sicher sind, da sie auf einer separaten Kopie der Collection erfolgen.

CopyOnWrite-Ansichten:

Note
Hinweis

Wie auf dem Bild zu sehen ist, wird beim Hinzufügen eines neuen Elements eine Kopie dieser Datenstruktur erstellt. Alle Threads, die vor der Änderung mit dieser Collection gearbeitet haben, setzen ihre Arbeit ohne Probleme fort, da sich diese Änderungen nicht auf die von ihnen verwendete CopyOnWrite-Kopie auswirken!

CopyOnWriteArraySet

CopyOnWriteArraySet ist eine threadsichere Implementierung einer Menge, die auf CopyOnWriteArrayList basiert. Die Threadsicherheit wird gewährleistet, indem bei jeder Änderung, wie dem Hinzufügen oder Entfernen von Elementen, eine neue Kopie der Basismenge erstellt wird.

Dieser Ansatz ist besonders nützlich, wenn die Menge häufig gelesen und selten verändert wird, da er allen Threads eine konsistente Ansicht der Menge bietet, ohne dass eine Synchronisierung erforderlich ist.

CopyOnWriteArrayList

CopyOnWriteArrayList ist eine threadsichere Variante von ArrayList, die Threadsicherheit gewährleistet, indem bei jeder Änderung eine neue Kopie des zugrunde liegenden Arrays erstellt wird.

Dieses Design bietet einen fehlertoleranten Iterator, der keine ConcurrentModificationException auslöst, da er auf einem Schnappschuss des Arrays arbeitet, der zum Zeitpunkt der Erstellung des Iterators aufgenommen wurde. Am besten geeignet für Situationen, in denen Leseoperationen deutlich häufiger als Schreiboperationen auftreten, da der Aufwand für das Kopieren des gesamten Arrays bei jedem Schreibvorgang erheblich sein kann.

Praktisches Anwendungsbeispiel

Methoden der CopyOnWrite-Kollektion

addIfAbsent(E e): Fügt ein Element zur Liste hinzu, nur wenn es noch nicht in der Liste/Mehrfachliste vorhanden ist.

Main.java

Main.java

copy
123456789101112131415161718192021
package com.example; import java.util.concurrent.CopyOnWriteArrayList; public class Main { public static void main(String[] args) { CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>(); list.add("apple"); list.add("banana"); // Attempt to add a duplicate element list.addIfAbsent("apple"); // This will not add "apple" again // Adding a new element list.addIfAbsent("orange"); // This will add "orange" System.out.println(list); // Output: [apple, banana, orange] } }

In diesem Beispiel wird „apple“ nicht erneut hinzugefügt, da es bereits in der Liste vorhanden ist. Die Methode addIfAbsent() verhindert doppelte Einträge und stellt die Eindeutigkeit der Elemente sicher.

addAllAbsent(Collection<? extends E> c): Fügt alle Elemente aus der angegebenen Collection zur Liste/Mehrfachliste hinzu und ignoriert bereits vorhandene Elemente.

Main.java

Main.java

copy
12345678910111213141516171819202122
package com.example; import java.util.Arrays; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; public class Main { public static void main(String[] args) { CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>(); list.add("apple"); list.add("banana"); List<String> newFruits = Arrays.asList("banana", "cherry", "date"); // Adding elements from the collection, ignoring duplicates list.addAllAbsent(newFruits); System.out.println(list); // Output: [apple, banana, cherry, date] } }

In diesem Beispiel ist "banana" bereits in der Liste vorhanden, daher wird addAllAbsent() sie nicht erneut hinzufügen. Die Methode stellt sicher, dass nur eindeutige Elemente aus der bereitgestellten Sammlung zur Liste hinzugefügt werden.

Note
Hinweis

Alle anderen Methoden der CopyOnWrite-Sammlungen ähneln denen ihrer übergeordneten Sammlungen; sie kopieren einfach den Zustand der Sammlung, wann immer Änderungen vorgenommen werden.

Einschränkungen und Vorteile

😔Einschränkungen:

CopyOnWrite-Sammlungen weisen erhebliche Einschränkungen auf. Sie verursachen einen Speicheraufwand, da bei jeder Änderung eine neue Kopie der Sammlung erstellt wird, was beträchtlich sein kann. Dieses Design macht sie weniger geeignet für Szenarien, in denen häufige Datenänderungen erforderlich sind.

💪Vorteile:

Andererseits bieten CopyOnWrite-Sammlungen bedeutende Vorteile. Sie sind äußerst effizient beim Lesen von Daten in einer multithreaded Umgebung. Diese Sammlungen zeigen eine hervorragende Leistung in Situationen, in denen Leseoperationen deutlich häufiger als Schreiboperationen auftreten, was sie zu einer ausgezeichneten Wahl für solche Anwendungsfälle macht.

Note
Hinweis

Aufgrund des Kopierens bei jeder Änderung können CopyOnWrite-Sammlungen mehr Speicher verbrauchen und sind nicht für Szenarien mit häufigen Schreiboperationen geeignet. Sie sind am effektivsten, wenn Leseoperationen gegenüber Schreiboperationen überwiegen.

1. Was passiert, wenn die Methode addIfAbsent(E e) in CopyOnWriteArrayList aufgerufen wird?

2. Warum sind CopyOnWrite-Sammlungen besonders für Szenarien mit häufigen Lesezugriffen und seltenen Datenänderungen geeignet?

question mark

Was passiert, wenn die Methode addIfAbsent(E e) in CopyOnWriteArrayList aufgerufen wird?

Select the correct answer

question mark

Warum sind CopyOnWrite-Sammlungen besonders für Szenarien mit häufigen Lesezugriffen und seltenen Datenänderungen geeignet?

Select the correct answer

War alles klar?

Wie können wir es verbessern?

Danke für Ihr Feedback!

Abschnitt 2. Kapitel 7
some-alt