Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lære Eksempler på Bruk av Collections-Metoder | Synkroniserte Samlinger
Multitråding i Java

bookEksempler på Bruk av Collections-Metoder

Note
Merk

I dag skal vi hovedsakelig se på metoder som hjelper til med å lage trådsikre samlinger.

Collections-metoder

Her er noen viktige metoder levert av klassen for å lage synkroniserte Collections samlinger:

synchronizedList(List<T> list): Returnerer en synkronisert (trådsikker) liste som støtter samme kontrakt som den oppgitte listen.

Main.java

Main.java

copy
1
List<Object> listSync = Collections.synchronizedList(new ArrayList<>());

synchronizedSet(Set<T> set): Returnerer et synkronisert (trådsikkert) sett som støtter samme kontrakt som det oppgitte settet.

Main.java

Main.java

copy
1
Set<Object> setSync = Collections.synchronizedSet(new HashSet<>());

synchronizedMap(Map<K, V> m): Returnerer et synkronisert (trådsikkert) map som støtter samme kontrakt som det overførte map-et.

Main.java

Main.java

copy
1
Map<Object, Object> mapSync = Collections.synchronizedMap(new HashMap<>());

unmodifiableList(List<? extends T> list): Returnerer en uforanderlig liste som inneholder de samme elementene som den angitte listen.

Main.java

Main.java

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): Returnerer et uforanderlig map som inneholder de samme tilordningene som det angitte mapet.

Main.java

Main.java

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): Returnerer et ikke-modifiserbart sett som inneholder de samme elementene som det spesifiserte settet.

Main.java

Main.java

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

Hva er da forskjellen mellom å opprette synkroniserte samlinger gjennom vanlige implementasjoner (de som ble diskutert i forrige kapittel) og å bruke Collections-metoder?

La oss se på forskjellen ved å bruke én Map-samling som eksempel

Forskjeller mellom ConcurrentHashMap og synchronizedMap()

ConcurrentHashMap benytter en avansert metode kjent som lock splitting, som deler opp map i segmenter og synkroniserer operasjoner kun på segmentnivå. Denne tilnærmingen gjør det mulig for flere tråder å lese og skrive data samtidig i forskjellige segmenter av map-en, noe som forbedrer samtidighet og ytelse.

Metoden synchronizedMap() pakker det opprinnelige kartet inn i et synkronisert proxy-objekt. Alle metodene til dette proxy-objektet er synkroniserte, noe som sikrer trådsikkerhet. Denne tilnærmingen kan imidlertid redusere ytelsen i et flertrådet miljø på grunn av høy låsefrekvens.

For eksempel, hvis ConcurrentHashMap skriver til ulike buckets, vil trådene ikke blokkere hverandre. Men hvis én bucket aksesseres av 2 tråder, må én av dem vente. På den annen side, hvis samlingen er opprettet via synchronizedMap(), vil kun 1 tråd ha tilgang til alle buckets, og hele kartet er blokkert.

Dette betyr at inntil én tråd er ferdig med sitt arbeid, vil andre tråder ikke kunne komme inn. Som et resultat blir operasjoner i ConcurrentHashMap rett og slett utført raskere.

Det finnes også andre metoder i Collections for praktisk arbeid med samlinger:

Note
Merk

Collections-klassen tilbyr praktiske metoder for å arbeide med collections i Java, og forenkler ofte brukte operasjoner. Synkroniserte collections opprettet via Collections-metoder er nyttige for trådsikkerhet, men for mer komplekse flertrådede oppgaver er det bedre å bruke collections fra java.util.concurrent-pakken.

1. Hvilken metode i Collections-klassen brukes for å opprette en uforanderlig liste?

2. Hvilken av følgende metoder i Collections-klassen returnerer et trådsikkert map?

3. Hva er forskjellen mellom ConcurrentHashMap og synchronizedMap?

question mark

Hvilken metode i Collections-klassen brukes for å opprette en uforanderlig liste?

Select the correct answer

question mark

Hvilken av følgende metoder i Collections-klassen returnerer et trådsikkert map?

Select the correct answer

question mark

Hva er forskjellen mellom ConcurrentHashMap og synchronizedMap?

Select the correct answer

Alt var klart?

Hvordan kan vi forbedre det?

Takk for tilbakemeldingene dine!

Seksjon 2. Kapittel 8

Spør AI

expand

Spør AI

ChatGPT

Spør om hva du vil, eller prøv ett av de foreslåtte spørsmålene for å starte chatten vår

Awesome!

Completion rate improved to 3.33

bookEksempler på Bruk av Collections-Metoder

Sveip for å vise menyen

Note
Merk

I dag skal vi hovedsakelig se på metoder som hjelper til med å lage trådsikre samlinger.

Collections-metoder

Her er noen viktige metoder levert av klassen for å lage synkroniserte Collections samlinger:

synchronizedList(List<T> list): Returnerer en synkronisert (trådsikker) liste som støtter samme kontrakt som den oppgitte listen.

Main.java

Main.java

copy
1
List<Object> listSync = Collections.synchronizedList(new ArrayList<>());

synchronizedSet(Set<T> set): Returnerer et synkronisert (trådsikkert) sett som støtter samme kontrakt som det oppgitte settet.

Main.java

Main.java

copy
1
Set<Object> setSync = Collections.synchronizedSet(new HashSet<>());

synchronizedMap(Map<K, V> m): Returnerer et synkronisert (trådsikkert) map som støtter samme kontrakt som det overførte map-et.

Main.java

Main.java

copy
1
Map<Object, Object> mapSync = Collections.synchronizedMap(new HashMap<>());

unmodifiableList(List<? extends T> list): Returnerer en uforanderlig liste som inneholder de samme elementene som den angitte listen.

Main.java

Main.java

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): Returnerer et uforanderlig map som inneholder de samme tilordningene som det angitte mapet.

Main.java

Main.java

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): Returnerer et ikke-modifiserbart sett som inneholder de samme elementene som det spesifiserte settet.

Main.java

Main.java

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

Hva er da forskjellen mellom å opprette synkroniserte samlinger gjennom vanlige implementasjoner (de som ble diskutert i forrige kapittel) og å bruke Collections-metoder?

La oss se på forskjellen ved å bruke én Map-samling som eksempel

Forskjeller mellom ConcurrentHashMap og synchronizedMap()

ConcurrentHashMap benytter en avansert metode kjent som lock splitting, som deler opp map i segmenter og synkroniserer operasjoner kun på segmentnivå. Denne tilnærmingen gjør det mulig for flere tråder å lese og skrive data samtidig i forskjellige segmenter av map-en, noe som forbedrer samtidighet og ytelse.

Metoden synchronizedMap() pakker det opprinnelige kartet inn i et synkronisert proxy-objekt. Alle metodene til dette proxy-objektet er synkroniserte, noe som sikrer trådsikkerhet. Denne tilnærmingen kan imidlertid redusere ytelsen i et flertrådet miljø på grunn av høy låsefrekvens.

For eksempel, hvis ConcurrentHashMap skriver til ulike buckets, vil trådene ikke blokkere hverandre. Men hvis én bucket aksesseres av 2 tråder, må én av dem vente. På den annen side, hvis samlingen er opprettet via synchronizedMap(), vil kun 1 tråd ha tilgang til alle buckets, og hele kartet er blokkert.

Dette betyr at inntil én tråd er ferdig med sitt arbeid, vil andre tråder ikke kunne komme inn. Som et resultat blir operasjoner i ConcurrentHashMap rett og slett utført raskere.

Det finnes også andre metoder i Collections for praktisk arbeid med samlinger:

Note
Merk

Collections-klassen tilbyr praktiske metoder for å arbeide med collections i Java, og forenkler ofte brukte operasjoner. Synkroniserte collections opprettet via Collections-metoder er nyttige for trådsikkerhet, men for mer komplekse flertrådede oppgaver er det bedre å bruke collections fra java.util.concurrent-pakken.

1. Hvilken metode i Collections-klassen brukes for å opprette en uforanderlig liste?

2. Hvilken av følgende metoder i Collections-klassen returnerer et trådsikkert map?

3. Hva er forskjellen mellom ConcurrentHashMap og synchronizedMap?

question mark

Hvilken metode i Collections-klassen brukes for å opprette en uforanderlig liste?

Select the correct answer

question mark

Hvilken av følgende metoder i Collections-klassen returnerer et trådsikkert map?

Select the correct answer

question mark

Hva er forskjellen mellom ConcurrentHashMap og synchronizedMap?

Select the correct answer

Alt var klart?

Hvordan kan vi forbedre det?

Takk for tilbakemeldingene dine!

Seksjon 2. Kapittel 8
some-alt