Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lære Copyonwrite-Samling | Synchroniserede Samlinger
Quizzes & Challenges
Quizzes
Challenges
/
Multitrådning i Java

bookCopyonwrite-Samling

Vi har udforsket mange synkroniserede samlinger sammen, og hvis du har mestret de andre, vil du finde denne endnu mere ligetil.

Virkelighedseksempel

En webapplikation, der bruger CopyOnWriteArrayList til at gemme begivenhedsabonnenter. Flere tråde kan samtidig hente en liste over nuværende abonnenter for at underrette dem om ændringer, mens andre tråde kan tilføje eller fjerne abonnenter.

Forskelle fra andre typer

CopyOnWrite-samlinger opretter en kopi af samlingen, hver gang der foretages en ændring, hvilket sikrer, at læseoperationer ikke blokeres af dataændringer og dermed giver trådsikkerhed for læsninger, selvom skriveoperationer ikke er trådsikre, da de udføres på en separat kopi af samlingen.

CopyOnWrite-visninger:

Note
Bemærk

Som det ses på billedet, når et nyt element tilføjes, oprettes en kopi af denne datastruktur. Alle tråde, der arbejdede med denne samling før ændringen, fortsætter deres arbejde uden problemer, da disse ændringer ikke påvirker den CopyOnWrite-kopi, de bruger!

CopyOnWriteArraySet

CopyOnWriteArraySet er en trådsikker implementering af et set baseret på CopyOnWriteArrayList. Den sikrer trådsikkerhed ved at oprette en ny kopi af det underliggende set, hver gang der sker en ændring, såsom tilføjelse eller fjernelse af elementer.

Denne tilgang er særligt nyttig, når settet læses hyppigt og ændres sjældent, da det giver et konsistent billede af settet for alle tråde uden behov for synkronisering.

CopyOnWriteArrayList

CopyOnWriteArrayList er en trådsikker variant af ArrayList, der sikrer trådsikkerhed ved at oprette en ny kopi af det underliggende array, hver gang det ændres.

Dette design tilbyder en fejltolerant iterator, der ikke kaster en ConcurrentModificationException, fordi den arbejder på et snapshot af arrayet taget på det tidspunkt, hvor iteratoren blev oprettet. Den egner sig bedst til situationer, hvor læseoperationer forekommer væsentligt oftere end skriveoperationer, da omkostningerne ved at kopiere hele arrayet ved hver skrivning kan være betydelige.

Praktisk eksempel på anvendelsestilfælde

Metoder i CopyOnWrite-samlingen

addIfAbsent(E e): Tilføjer et element til listen kun hvis det ikke allerede findes i listen/flere.

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] } }

I dette eksempel bliver "apple" ikke tilføjet igen, fordi det allerede findes i listen. Metoden addIfAbsent() forhindrer dubletter og opretholder elementernes unikke karakter.

addAllAbsent(Collection<? extends E> c): Tilføjer alle elementer fra den angivne samling til listen/flere, og ignorerer allerede eksisterende elementer.

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] } }

I dette eksempel er "banana" allerede til stede i listen, så addAllAbsent() vil ikke tilføje den igen. Metoden sikrer, at kun unikke elementer fra den angivne samling tilføjes til listen.

Note
Bemærk

Alle andre metoder i CopyOnWrite-samlinger ligner dem fra deres overordnede samlinger; de kopierer blot tilstanden af samlingen, hver gang der foretages ændringer.

Begrænsninger og fordele

😔Begrænsninger:

CopyOnWrite-samlinger har markante begrænsninger. De medfører en hukommelsesomkostning på grund af oprettelsen af en ny kopi af samlingen, hver gang der foretages en ændring, hvilket kan være betydeligt. Denne design gør dem mindre egnede til scenarier, hvor der ofte skal foretages dataændringer.

💪Fordele:

Omvendt tilbyder CopyOnWrite-samlinger væsentlige fordele. De er meget effektive til læsning af data i et multitrådet miljø. Disse samlinger yder særdeles godt i situationer, hvor læseoperationer væsentligt overstiger skriveoperationer, hvilket gør dem til et fremragende valg til sådanne anvendelser.

Note
Bemærk

Dog kan CopyOnWrite-samlinger på grund af kopiering ved hver ændring forbruge mere hukommelse og er ikke egnede til scenarier med hyppige skriveoperationer. De er mest effektive, når læseoperationer dominerer over skriveoperationer.

1. Hvad sker der, når du kalder metoden addIfAbsent(E e) i CopyOnWriteArrayList?

2. Hvorfor er CopyOnWrite-samlinger særligt velegnede til scenarier med hyppige læsninger og sjældne dataændringer?

question mark

Hvad sker der, når du kalder metoden addIfAbsent(E e) i CopyOnWriteArrayList?

Select the correct answer

question mark

Hvorfor er CopyOnWrite-samlinger særligt velegnede til scenarier med hyppige læsninger og sjældne dataændringer?

Select the correct answer

Var alt klart?

Hvordan kan vi forbedre det?

Tak for dine kommentarer!

Sektion 2. Kapitel 7

Spørg AI

expand

Spørg AI

ChatGPT

Spørg om hvad som helst eller prøv et af de foreslåede spørgsmål for at starte vores chat

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-Samling

Stryg for at vise menuen

Vi har udforsket mange synkroniserede samlinger sammen, og hvis du har mestret de andre, vil du finde denne endnu mere ligetil.

Virkelighedseksempel

En webapplikation, der bruger CopyOnWriteArrayList til at gemme begivenhedsabonnenter. Flere tråde kan samtidig hente en liste over nuværende abonnenter for at underrette dem om ændringer, mens andre tråde kan tilføje eller fjerne abonnenter.

Forskelle fra andre typer

CopyOnWrite-samlinger opretter en kopi af samlingen, hver gang der foretages en ændring, hvilket sikrer, at læseoperationer ikke blokeres af dataændringer og dermed giver trådsikkerhed for læsninger, selvom skriveoperationer ikke er trådsikre, da de udføres på en separat kopi af samlingen.

CopyOnWrite-visninger:

Note
Bemærk

Som det ses på billedet, når et nyt element tilføjes, oprettes en kopi af denne datastruktur. Alle tråde, der arbejdede med denne samling før ændringen, fortsætter deres arbejde uden problemer, da disse ændringer ikke påvirker den CopyOnWrite-kopi, de bruger!

CopyOnWriteArraySet

CopyOnWriteArraySet er en trådsikker implementering af et set baseret på CopyOnWriteArrayList. Den sikrer trådsikkerhed ved at oprette en ny kopi af det underliggende set, hver gang der sker en ændring, såsom tilføjelse eller fjernelse af elementer.

Denne tilgang er særligt nyttig, når settet læses hyppigt og ændres sjældent, da det giver et konsistent billede af settet for alle tråde uden behov for synkronisering.

CopyOnWriteArrayList

CopyOnWriteArrayList er en trådsikker variant af ArrayList, der sikrer trådsikkerhed ved at oprette en ny kopi af det underliggende array, hver gang det ændres.

Dette design tilbyder en fejltolerant iterator, der ikke kaster en ConcurrentModificationException, fordi den arbejder på et snapshot af arrayet taget på det tidspunkt, hvor iteratoren blev oprettet. Den egner sig bedst til situationer, hvor læseoperationer forekommer væsentligt oftere end skriveoperationer, da omkostningerne ved at kopiere hele arrayet ved hver skrivning kan være betydelige.

Praktisk eksempel på anvendelsestilfælde

Metoder i CopyOnWrite-samlingen

addIfAbsent(E e): Tilføjer et element til listen kun hvis det ikke allerede findes i listen/flere.

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] } }

I dette eksempel bliver "apple" ikke tilføjet igen, fordi det allerede findes i listen. Metoden addIfAbsent() forhindrer dubletter og opretholder elementernes unikke karakter.

addAllAbsent(Collection<? extends E> c): Tilføjer alle elementer fra den angivne samling til listen/flere, og ignorerer allerede eksisterende elementer.

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] } }

I dette eksempel er "banana" allerede til stede i listen, så addAllAbsent() vil ikke tilføje den igen. Metoden sikrer, at kun unikke elementer fra den angivne samling tilføjes til listen.

Note
Bemærk

Alle andre metoder i CopyOnWrite-samlinger ligner dem fra deres overordnede samlinger; de kopierer blot tilstanden af samlingen, hver gang der foretages ændringer.

Begrænsninger og fordele

😔Begrænsninger:

CopyOnWrite-samlinger har markante begrænsninger. De medfører en hukommelsesomkostning på grund af oprettelsen af en ny kopi af samlingen, hver gang der foretages en ændring, hvilket kan være betydeligt. Denne design gør dem mindre egnede til scenarier, hvor der ofte skal foretages dataændringer.

💪Fordele:

Omvendt tilbyder CopyOnWrite-samlinger væsentlige fordele. De er meget effektive til læsning af data i et multitrådet miljø. Disse samlinger yder særdeles godt i situationer, hvor læseoperationer væsentligt overstiger skriveoperationer, hvilket gør dem til et fremragende valg til sådanne anvendelser.

Note
Bemærk

Dog kan CopyOnWrite-samlinger på grund af kopiering ved hver ændring forbruge mere hukommelse og er ikke egnede til scenarier med hyppige skriveoperationer. De er mest effektive, når læseoperationer dominerer over skriveoperationer.

1. Hvad sker der, når du kalder metoden addIfAbsent(E e) i CopyOnWriteArrayList?

2. Hvorfor er CopyOnWrite-samlinger særligt velegnede til scenarier med hyppige læsninger og sjældne dataændringer?

question mark

Hvad sker der, når du kalder metoden addIfAbsent(E e) i CopyOnWriteArrayList?

Select the correct answer

question mark

Hvorfor er CopyOnWrite-samlinger særligt velegnede til scenarier med hyppige læsninger og sjældne dataændringer?

Select the correct answer

Var alt klart?

Hvordan kan vi forbedre det?

Tak for dine kommentarer!

Sektion 2. Kapitel 7
some-alt