Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Leer Copyonwrite-Collectie | Gesynchroniseerde Collecties
Multithreading in Java

bookCopyonwrite-Collectie

We hebben samen veel gesynchroniseerde collecties onderzocht, en als je de andere hebt beheerst, zal je merken dat deze nog eenvoudiger is.

Praktijkvoorbeeld

Een webapplicatie die CopyOnWriteArrayList gebruikt om event-abonnees op te slaan. Meerdere threads kunnen gelijktijdig een lijst van huidige abonnees ophalen om hen te informeren over wijzigingen, terwijl andere threads abonnees kunnen toevoegen of verwijderen.

Verschillen met andere typen

CopyOnWrite-collecties maken een kopie van de collectie telkens wanneer er een wijziging wordt aangebracht, waardoor leesbewerkingen niet worden geblokkeerd door gegevenswijzigingen. Dit zorgt voor threadveiligheid bij lezen, hoewel schrijfbewerkingen niet threadveilig zijn omdat deze plaatsvinden op een aparte kopie van de collectie.

CopyOnWrite-weergaven:

Note
Opmerking

Zoals te zien is op de afbeelding, wanneer een nieuw item wordt toegevoegd, maken we een kopie van deze datastructuur. Alle threads die vóór deze wijziging met deze collectie werkten, kunnen hun werk zonder problemen voortzetten, omdat deze wijzigingen geen invloed hebben op de CopyOnWrite-kopie die zij gebruiken!

CopyOnWriteArraySet

CopyOnWriteArraySet is een thread-veilige implementatie van een set, gebaseerd op CopyOnWriteArrayList. Het waarborgt thread-veiligheid door bij elke wijziging, zoals het toevoegen of verwijderen van elementen, een nieuwe kopie van de onderliggende set te maken.

Deze aanpak is vooral nuttig wanneer de set vaak wordt gelezen en zelden wordt gewijzigd, omdat het een consistente weergave van de set biedt voor alle threads zonder dat synchronisatie nodig is.

CopyOnWriteArrayList

CopyOnWriteArrayList is een thread-veilige variant van ArrayList die thread-veiligheid garandeert door bij elke wijziging een nieuwe kopie van de onderliggende array te maken.

Dit ontwerp biedt een fouttolerante iterator die geen ConcurrentModificationException gooit, omdat deze werkt op een momentopname van de array die is genomen op het moment dat de iterator werd aangemaakt. Het is het meest geschikt voor situaties waarin leesbewerkingen aanzienlijk vaker voorkomen dan schrijfbewerkingen, aangezien het kopiëren van de volledige array bij elke schrijfoperatie aanzienlijke overhead kan veroorzaken.

Praktisch Voorbeeld van Gebruikstoepassing

Methoden van de CopyOnWrite-collectie

addIfAbsent(E e): Voegt een element toe aan de lijst alleen als het nog niet in de lijst/meerdere voorkomt.

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 dit voorbeeld wordt "apple" niet opnieuw toegevoegd omdat het al bestaat in de lijst. De addIfAbsent() methode voorkomt dubbele vermeldingen en behoudt de uniciteit van elementen.

addAllAbsent(Collection<? extends E> c): Voegt alle elementen uit de opgegeven collectie toe aan de lijst/meervoud, waarbij reeds bestaande elementen worden genegeerd.

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 dit voorbeeld is "banana" al aanwezig in de lijst, dus addAllAbsent() zal deze niet opnieuw toevoegen. De methode garandeert dat alleen unieke elementen uit de opgegeven collectie aan de lijst worden toegevoegd.

Note
Opmerking

Alle andere methoden van CopyOnWrite-collecties zijn vergelijkbaar met die van hun bovenliggende collecties; ze kopiëren de status van de collectie telkens wanneer er wijzigingen worden aangebracht.

Beperkingen en Voordelen

😔Beperkingen:

CopyOnWrite-collecties hebben aanzienlijke beperkingen. Ze brengen een geheugenkost met zich mee doordat er bij elke wijziging een nieuwe kopie van de collectie wordt gemaakt, wat aanzienlijk kan zijn. Dit ontwerp maakt ze minder geschikt voor scenario's waarin frequente gegevenswijzigingen nodig zijn.

💪Voordelen:

Aan de andere kant bieden CopyOnWrite-collecties aanzienlijke voordelen. Ze zijn zeer efficiënt voor het lezen van gegevens in een multithreaded omgeving. Deze collecties presteren uitzonderlijk goed in situaties waarin leesbewerkingen aanzienlijk vaker voorkomen dan schrijfbewerkingen, waardoor ze een uitstekende keuze zijn voor dergelijke toepassingen.

Note
Opmerking

Echter, door kopiëren bij elke wijziging kunnen CopyOnWrite-collecties meer geheugen verbruiken en zijn ze niet geschikt voor scenario's met frequente schrijfoperaties. Ze zijn het meest effectief wanneer leesoperaties overheersen ten opzichte van schrijfoperaties.

1. Wat gebeurt er wanneer je de methode addIfAbsent(E e) aanroept in CopyOnWriteArrayList?

2. Waarom zijn CopyOnWrite-collecties bijzonder geschikt voor scenario's met veelvuldige leesbewerkingen en zeldzame gegevenswijzigingen?

question mark

Wat gebeurt er wanneer je de methode addIfAbsent(E e) aanroept in CopyOnWriteArrayList?

Select the correct answer

question mark

Waarom zijn CopyOnWrite-collecties bijzonder geschikt voor scenario's met veelvuldige leesbewerkingen en zeldzame gegevenswijzigingen?

Select the correct answer

Was alles duidelijk?

Hoe kunnen we het verbeteren?

Bedankt voor je feedback!

Sectie 2. Hoofdstuk 7

Vraag AI

expand

Vraag AI

ChatGPT

Vraag wat u wilt of probeer een van de voorgestelde vragen om onze chat te starten.

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

bookCopyonwrite-Collectie

Veeg om het menu te tonen

We hebben samen veel gesynchroniseerde collecties onderzocht, en als je de andere hebt beheerst, zal je merken dat deze nog eenvoudiger is.

Praktijkvoorbeeld

Een webapplicatie die CopyOnWriteArrayList gebruikt om event-abonnees op te slaan. Meerdere threads kunnen gelijktijdig een lijst van huidige abonnees ophalen om hen te informeren over wijzigingen, terwijl andere threads abonnees kunnen toevoegen of verwijderen.

Verschillen met andere typen

CopyOnWrite-collecties maken een kopie van de collectie telkens wanneer er een wijziging wordt aangebracht, waardoor leesbewerkingen niet worden geblokkeerd door gegevenswijzigingen. Dit zorgt voor threadveiligheid bij lezen, hoewel schrijfbewerkingen niet threadveilig zijn omdat deze plaatsvinden op een aparte kopie van de collectie.

CopyOnWrite-weergaven:

Note
Opmerking

Zoals te zien is op de afbeelding, wanneer een nieuw item wordt toegevoegd, maken we een kopie van deze datastructuur. Alle threads die vóór deze wijziging met deze collectie werkten, kunnen hun werk zonder problemen voortzetten, omdat deze wijzigingen geen invloed hebben op de CopyOnWrite-kopie die zij gebruiken!

CopyOnWriteArraySet

CopyOnWriteArraySet is een thread-veilige implementatie van een set, gebaseerd op CopyOnWriteArrayList. Het waarborgt thread-veiligheid door bij elke wijziging, zoals het toevoegen of verwijderen van elementen, een nieuwe kopie van de onderliggende set te maken.

Deze aanpak is vooral nuttig wanneer de set vaak wordt gelezen en zelden wordt gewijzigd, omdat het een consistente weergave van de set biedt voor alle threads zonder dat synchronisatie nodig is.

CopyOnWriteArrayList

CopyOnWriteArrayList is een thread-veilige variant van ArrayList die thread-veiligheid garandeert door bij elke wijziging een nieuwe kopie van de onderliggende array te maken.

Dit ontwerp biedt een fouttolerante iterator die geen ConcurrentModificationException gooit, omdat deze werkt op een momentopname van de array die is genomen op het moment dat de iterator werd aangemaakt. Het is het meest geschikt voor situaties waarin leesbewerkingen aanzienlijk vaker voorkomen dan schrijfbewerkingen, aangezien het kopiëren van de volledige array bij elke schrijfoperatie aanzienlijke overhead kan veroorzaken.

Praktisch Voorbeeld van Gebruikstoepassing

Methoden van de CopyOnWrite-collectie

addIfAbsent(E e): Voegt een element toe aan de lijst alleen als het nog niet in de lijst/meerdere voorkomt.

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 dit voorbeeld wordt "apple" niet opnieuw toegevoegd omdat het al bestaat in de lijst. De addIfAbsent() methode voorkomt dubbele vermeldingen en behoudt de uniciteit van elementen.

addAllAbsent(Collection<? extends E> c): Voegt alle elementen uit de opgegeven collectie toe aan de lijst/meervoud, waarbij reeds bestaande elementen worden genegeerd.

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 dit voorbeeld is "banana" al aanwezig in de lijst, dus addAllAbsent() zal deze niet opnieuw toevoegen. De methode garandeert dat alleen unieke elementen uit de opgegeven collectie aan de lijst worden toegevoegd.

Note
Opmerking

Alle andere methoden van CopyOnWrite-collecties zijn vergelijkbaar met die van hun bovenliggende collecties; ze kopiëren de status van de collectie telkens wanneer er wijzigingen worden aangebracht.

Beperkingen en Voordelen

😔Beperkingen:

CopyOnWrite-collecties hebben aanzienlijke beperkingen. Ze brengen een geheugenkost met zich mee doordat er bij elke wijziging een nieuwe kopie van de collectie wordt gemaakt, wat aanzienlijk kan zijn. Dit ontwerp maakt ze minder geschikt voor scenario's waarin frequente gegevenswijzigingen nodig zijn.

💪Voordelen:

Aan de andere kant bieden CopyOnWrite-collecties aanzienlijke voordelen. Ze zijn zeer efficiënt voor het lezen van gegevens in een multithreaded omgeving. Deze collecties presteren uitzonderlijk goed in situaties waarin leesbewerkingen aanzienlijk vaker voorkomen dan schrijfbewerkingen, waardoor ze een uitstekende keuze zijn voor dergelijke toepassingen.

Note
Opmerking

Echter, door kopiëren bij elke wijziging kunnen CopyOnWrite-collecties meer geheugen verbruiken en zijn ze niet geschikt voor scenario's met frequente schrijfoperaties. Ze zijn het meest effectief wanneer leesoperaties overheersen ten opzichte van schrijfoperaties.

1. Wat gebeurt er wanneer je de methode addIfAbsent(E e) aanroept in CopyOnWriteArrayList?

2. Waarom zijn CopyOnWrite-collecties bijzonder geschikt voor scenario's met veelvuldige leesbewerkingen en zeldzame gegevenswijzigingen?

question mark

Wat gebeurt er wanneer je de methode addIfAbsent(E e) aanroept in CopyOnWriteArrayList?

Select the correct answer

question mark

Waarom zijn CopyOnWrite-collecties bijzonder geschikt voor scenario's met veelvuldige leesbewerkingen en zeldzame gegevenswijzigingen?

Select the correct answer

Was alles duidelijk?

Hoe kunnen we het verbeteren?

Bedankt voor je feedback!

Sectie 2. Hoofdstuk 7
some-alt