Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lära Copyonwrite-samling | Synkroniserade Samlingar
Quizzes & Challenges
Quizzes
Challenges
/
Multitrådning i Java

bookCopyonwrite-samling

Vi har utforskat många synkroniserade samlingar tillsammans, och om du har behärskat de andra kommer du att finna denna ännu mer lättförståelig.

Exempel från verkligheten

En webbapplikation som använder CopyOnWriteArrayList för att lagra händelseprenumeranter. Flera trådar kan samtidigt hämta en lista över aktuella prenumeranter för att notifiera dem om förändringar, medan andra trådar kan lägga till eller ta bort prenumeranter.

Skillnader från andra typer

CopyOnWrite-samlingar skapar en kopia av samlingen varje gång en ändring görs, vilket säkerställer att läsoperationer inte blockeras av databasändringar och därmed ger trådsäkerhet för läsningar, även om skrivoperationer inte är trådsäkra eftersom de sker på en separat kopia av samlingen.

CopyOnWrite-vyer:

Note
Notering

Som vi kan se på bilden, när ett nytt element läggs till skapas en kopia av denna datastruktur. Alla trådar som arbetade med denna samling innan ändringen kommer att fortsätta sitt arbete utan problem, eftersom dessa ändringar inte påverkar den CopyOnWrite-kopia de använder!

CopyOnWriteArraySet

CopyOnWriteArraySet är en trådsäker implementation av en mängd baserad på CopyOnWriteArrayList. Den säkerställer trådsäkerhet genom att skapa en ny kopia av grundmängden varje gång en ändring, såsom tillägg eller borttagning av element, sker.

Denna metod är särskilt användbar när mängden läses ofta och ändras sällan, eftersom den ger en konsekvent vy av mängden för alla trådar utan att kräva synkronisering.

CopyOnWriteArrayList

CopyOnWriteArrayList är en trådsäker variant av ArrayList som säkerställer trådsäkerhet genom att skapa en ny kopia av den underliggande arrayen varje gång den modifieras.

Denna design erbjuder en feltolerant iterator som inte kastar ett ConcurrentModificationException eftersom den arbetar på en ögonblicksbild av arrayen som togs vid den tidpunkt då iteratorn skapades. Den lämpar sig bäst för situationer där läsoperationer är betydligt vanligare än skrivoperationer, eftersom overheaden av att kopiera hela arrayen vid varje skrivning kan vara betydande.

Praktiskt exempel på användningsfall

Metoder för CopyOnWrite-samlingen

addIfAbsent(E e): Lägger till ett element i listan endast om det inte redan finns i listan/multipeln.

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 detta exempel läggs inte "apple" till igen eftersom det redan finns i listan. Metoden addIfAbsent() förhindrar dubbletter och bevarar elementens unikhet.

addAllAbsent(Collection<? extends E> c): Lägger till alla element från den angivna samlingen till listan/flertal, och ignorerar redan existerande element.

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 det här exemplet är "banana" redan närvarande i listan, så addAllAbsent() kommer inte att lägga till den igen. Metoden säkerställer att endast unika element från den angivna samlingen läggs till i listan.

Note
Notering

Alla andra metoder för CopyOnWrite-samlingar liknar de hos deras överordnade samlingar; de kopierar helt enkelt tillståndet för samlingen varje gång ändringar görs.

Begränsningar och fördelar

😔Begränsningar:

CopyOnWrite-samlingar har tydliga begränsningar. De medför en minneskostnad eftersom en ny kopia av samlingen skapas varje gång en ändring görs, vilket kan vara betydande. Denna design gör dem mindre lämpliga för scenarier där frekventa dataändringar krävs.

💪Fördelar:

Å andra sidan erbjuder CopyOnWrite-samlingar betydande fördelar. De är mycket effektiva för läsning av data i en flertrådad miljö. Dessa samlingar presterar utmärkt i situationer där läsoperationer är betydligt fler än skrivoperationer, vilket gör dem till ett utmärkt val för sådana användningsfall.

Note
Observera

På grund av kopiering vid varje ändring kan CopyOnWrite-samlingar använda mer minne och är inte lämpliga för scenarier med frekventa skrivoperationer. De är mest effektiva när läsoperationer dominerar över skrivoperationer.

1. Vad händer när du anropar metoden addIfAbsent(E e) i CopyOnWriteArrayList?

2. Varför är CopyOnWrite-samlingar särskilt lämpliga för scenarier med frekventa läsningar och sällsynta dataändringar?

question mark

Vad händer när du anropar metoden addIfAbsent(E e) i CopyOnWriteArrayList?

Select the correct answer

question mark

Varför är CopyOnWrite-samlingar särskilt lämpliga för scenarier med frekventa läsningar och sällsynta dataändringar?

Select the correct answer

Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 2. Kapitel 7

Fråga AI

expand

Fråga AI

ChatGPT

Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal

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

Svep för att visa menyn

Vi har utforskat många synkroniserade samlingar tillsammans, och om du har behärskat de andra kommer du att finna denna ännu mer lättförståelig.

Exempel från verkligheten

En webbapplikation som använder CopyOnWriteArrayList för att lagra händelseprenumeranter. Flera trådar kan samtidigt hämta en lista över aktuella prenumeranter för att notifiera dem om förändringar, medan andra trådar kan lägga till eller ta bort prenumeranter.

Skillnader från andra typer

CopyOnWrite-samlingar skapar en kopia av samlingen varje gång en ändring görs, vilket säkerställer att läsoperationer inte blockeras av databasändringar och därmed ger trådsäkerhet för läsningar, även om skrivoperationer inte är trådsäkra eftersom de sker på en separat kopia av samlingen.

CopyOnWrite-vyer:

Note
Notering

Som vi kan se på bilden, när ett nytt element läggs till skapas en kopia av denna datastruktur. Alla trådar som arbetade med denna samling innan ändringen kommer att fortsätta sitt arbete utan problem, eftersom dessa ändringar inte påverkar den CopyOnWrite-kopia de använder!

CopyOnWriteArraySet

CopyOnWriteArraySet är en trådsäker implementation av en mängd baserad på CopyOnWriteArrayList. Den säkerställer trådsäkerhet genom att skapa en ny kopia av grundmängden varje gång en ändring, såsom tillägg eller borttagning av element, sker.

Denna metod är särskilt användbar när mängden läses ofta och ändras sällan, eftersom den ger en konsekvent vy av mängden för alla trådar utan att kräva synkronisering.

CopyOnWriteArrayList

CopyOnWriteArrayList är en trådsäker variant av ArrayList som säkerställer trådsäkerhet genom att skapa en ny kopia av den underliggande arrayen varje gång den modifieras.

Denna design erbjuder en feltolerant iterator som inte kastar ett ConcurrentModificationException eftersom den arbetar på en ögonblicksbild av arrayen som togs vid den tidpunkt då iteratorn skapades. Den lämpar sig bäst för situationer där läsoperationer är betydligt vanligare än skrivoperationer, eftersom overheaden av att kopiera hela arrayen vid varje skrivning kan vara betydande.

Praktiskt exempel på användningsfall

Metoder för CopyOnWrite-samlingen

addIfAbsent(E e): Lägger till ett element i listan endast om det inte redan finns i listan/multipeln.

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 detta exempel läggs inte "apple" till igen eftersom det redan finns i listan. Metoden addIfAbsent() förhindrar dubbletter och bevarar elementens unikhet.

addAllAbsent(Collection<? extends E> c): Lägger till alla element från den angivna samlingen till listan/flertal, och ignorerar redan existerande element.

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 det här exemplet är "banana" redan närvarande i listan, så addAllAbsent() kommer inte att lägga till den igen. Metoden säkerställer att endast unika element från den angivna samlingen läggs till i listan.

Note
Notering

Alla andra metoder för CopyOnWrite-samlingar liknar de hos deras överordnade samlingar; de kopierar helt enkelt tillståndet för samlingen varje gång ändringar görs.

Begränsningar och fördelar

😔Begränsningar:

CopyOnWrite-samlingar har tydliga begränsningar. De medför en minneskostnad eftersom en ny kopia av samlingen skapas varje gång en ändring görs, vilket kan vara betydande. Denna design gör dem mindre lämpliga för scenarier där frekventa dataändringar krävs.

💪Fördelar:

Å andra sidan erbjuder CopyOnWrite-samlingar betydande fördelar. De är mycket effektiva för läsning av data i en flertrådad miljö. Dessa samlingar presterar utmärkt i situationer där läsoperationer är betydligt fler än skrivoperationer, vilket gör dem till ett utmärkt val för sådana användningsfall.

Note
Observera

På grund av kopiering vid varje ändring kan CopyOnWrite-samlingar använda mer minne och är inte lämpliga för scenarier med frekventa skrivoperationer. De är mest effektiva när läsoperationer dominerar över skrivoperationer.

1. Vad händer när du anropar metoden addIfAbsent(E e) i CopyOnWriteArrayList?

2. Varför är CopyOnWrite-samlingar särskilt lämpliga för scenarier med frekventa läsningar och sällsynta dataändringar?

question mark

Vad händer när du anropar metoden addIfAbsent(E e) i CopyOnWriteArrayList?

Select the correct answer

question mark

Varför är CopyOnWrite-samlingar särskilt lämpliga för scenarier med frekventa läsningar och sällsynta dataändringar?

Select the correct answer

Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 2. Kapitel 7
some-alt