Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Oppiskele Esimerkkejä Kokoelmien Metodien Käytöstä | Synkronoidut Kokoelmat
Monisäikeisyys Javassa

bookEsimerkkejä Kokoelmien Metodien Käytöstä

Note
Huomio

Tänään tarkastelemme pääasiassa metodeja, jotka auttavat luomaan säikeiturvallisia kokoelmia.

Collections-luokan metodit

Tässä on joitakin tärkeitä metodeja, joita Collections-luokka tarjoaa synkronoitujen Collections kokoelmien luomiseen:

synchronizedList(List<T> list): Palauttaa synkronoidun (säikeiturvallisen) listan, joka noudattaa samaa sopimusta kuin annettu lista.

Main.java

Main.java

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

synchronizedSet(Set<T> set): Palauttaa synkronoidun (säikeiturvallisen) joukon, joka noudattaa samaa sopimusta kuin annettu joukko.

Main.java

Main.java

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

synchronizedMap(Map<K, V> m): Palauttaa synkronoidun (säikeiturvallisen) mapin, joka tukee samaa sopimusta kuin annettu map.

Main.java

Main.java

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

unmodifiableList(List<? extends T> list): Palauttaa muuttumattoman listan, joka sisältää samat alkiot kuin annettu lista.

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): Palauttaa muuttumattoman mapin, joka sisältää samat avain-arvo-parit kuin annettu map.

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): Palauttaa muuttumattoman joukon, joka sisältää samat alkiot kuin määritetty joukko.

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

Mikä siis on ero synkronoitujen kokoelmien luomisen välillä tavallisten toteutusten avulla (kuten aiemmissa luvuissa käsiteltiin) ja Collections-metodien käytön välillä?

Tarkastellaan eroa yhden Map-kokoelman esimerkin avulla

Eroja ConcurrentHashMapin ja synchronizedMap()-metodin välillä

ConcurrentHashMap käyttää kehittynyttä menetelmää nimeltä lukon jakaminen (lock splitting), jossa map jaetaan segmentteihin ja operaatiot synkronoidaan vain segmenttitasolla. Tämä mahdollistaa sen, että useat säikeet voivat samanaikaisesti lukea ja kirjoittaa tietoja eri segmentteihin, mikä parantaa samanaikaisuutta ja suorituskykyä.

Metodi synchronizedMap() käärii alkuperäisen mapin synkronoiduksi välittäjäobjektiksi. Kaikki tämän välittäjäobjektin metodit ovat synkronoituja, mikä takaa säikeiden turvallisuuden. Tämä lähestymistapa voi kuitenkin heikentää suorituskykyä monisäikeisessä ympäristössä korkean lukitustaajuuden vuoksi.

Esimerkiksi, jos ConcurrentHashMap kirjoittaa eri bucketteihin, säikeet eivät estä toisiaan. Jos kuitenkin yhtä buckettia käyttää 2 säiettä, toinen joutuu odottamaan. Toisaalta, jos kokoelma luodaan synchronizedMap()-menetelmällä, vain 1 säie pääsee kaikkiin bucketteihin, ja koko map lukitaan.

Tämä tarkoittaa, että kunnes yksi säie on suorittanut työnsä, muut säikeet eivät pääse sisään. Tämän seurauksena operaatiot ConcurrentHashMap:issa suoritetaan yksinkertaisesti nopeammin.

Kokoelmissa on myös muita metodeja, jotka helpottavat kokoelmien käsittelyä:

Note
Huomio

Collections-luokka tarjoaa käteviä menetelmiä kokoelmien käsittelyyn Javassa, mikä yksinkertaistaa yleisiä operaatioita. Synkronoidut kokoelmat, jotka luodaan Collections-menetelmillä, ovat hyödyllisiä säieturvallisuuden kannalta, mutta monimutkaisemmissa rinnakkaisohjelmoinnin tehtävissä on parempi käyttää java.util.concurrent-paketin kokoelmia.

1. Mitä menetelmää Collections-luokassa käytetään luomaan muuttumaton lista?

2. Mikä seuraavista Collections-luokan menetelmistä palauttaa säieturvallisen mapin?

3. Mikä on ero ConcurrentHashMapin ja synchronizedMapin välillä?

question mark

Mitä menetelmää Collections-luokassa käytetään luomaan muuttumaton lista?

Select the correct answer

question mark

Mikä seuraavista Collections-luokan menetelmistä palauttaa säieturvallisen mapin?

Select the correct answer

question mark

Mikä on ero ConcurrentHashMapin ja synchronizedMapin välillä?

Select the correct answer

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 2. Luku 8

Kysy tekoälyä

expand

Kysy tekoälyä

ChatGPT

Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme

Awesome!

Completion rate improved to 3.33

bookEsimerkkejä Kokoelmien Metodien Käytöstä

Pyyhkäise näyttääksesi valikon

Note
Huomio

Tänään tarkastelemme pääasiassa metodeja, jotka auttavat luomaan säikeiturvallisia kokoelmia.

Collections-luokan metodit

Tässä on joitakin tärkeitä metodeja, joita Collections-luokka tarjoaa synkronoitujen Collections kokoelmien luomiseen:

synchronizedList(List<T> list): Palauttaa synkronoidun (säikeiturvallisen) listan, joka noudattaa samaa sopimusta kuin annettu lista.

Main.java

Main.java

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

synchronizedSet(Set<T> set): Palauttaa synkronoidun (säikeiturvallisen) joukon, joka noudattaa samaa sopimusta kuin annettu joukko.

Main.java

Main.java

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

synchronizedMap(Map<K, V> m): Palauttaa synkronoidun (säikeiturvallisen) mapin, joka tukee samaa sopimusta kuin annettu map.

Main.java

Main.java

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

unmodifiableList(List<? extends T> list): Palauttaa muuttumattoman listan, joka sisältää samat alkiot kuin annettu lista.

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): Palauttaa muuttumattoman mapin, joka sisältää samat avain-arvo-parit kuin annettu map.

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): Palauttaa muuttumattoman joukon, joka sisältää samat alkiot kuin määritetty joukko.

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

Mikä siis on ero synkronoitujen kokoelmien luomisen välillä tavallisten toteutusten avulla (kuten aiemmissa luvuissa käsiteltiin) ja Collections-metodien käytön välillä?

Tarkastellaan eroa yhden Map-kokoelman esimerkin avulla

Eroja ConcurrentHashMapin ja synchronizedMap()-metodin välillä

ConcurrentHashMap käyttää kehittynyttä menetelmää nimeltä lukon jakaminen (lock splitting), jossa map jaetaan segmentteihin ja operaatiot synkronoidaan vain segmenttitasolla. Tämä mahdollistaa sen, että useat säikeet voivat samanaikaisesti lukea ja kirjoittaa tietoja eri segmentteihin, mikä parantaa samanaikaisuutta ja suorituskykyä.

Metodi synchronizedMap() käärii alkuperäisen mapin synkronoiduksi välittäjäobjektiksi. Kaikki tämän välittäjäobjektin metodit ovat synkronoituja, mikä takaa säikeiden turvallisuuden. Tämä lähestymistapa voi kuitenkin heikentää suorituskykyä monisäikeisessä ympäristössä korkean lukitustaajuuden vuoksi.

Esimerkiksi, jos ConcurrentHashMap kirjoittaa eri bucketteihin, säikeet eivät estä toisiaan. Jos kuitenkin yhtä buckettia käyttää 2 säiettä, toinen joutuu odottamaan. Toisaalta, jos kokoelma luodaan synchronizedMap()-menetelmällä, vain 1 säie pääsee kaikkiin bucketteihin, ja koko map lukitaan.

Tämä tarkoittaa, että kunnes yksi säie on suorittanut työnsä, muut säikeet eivät pääse sisään. Tämän seurauksena operaatiot ConcurrentHashMap:issa suoritetaan yksinkertaisesti nopeammin.

Kokoelmissa on myös muita metodeja, jotka helpottavat kokoelmien käsittelyä:

Note
Huomio

Collections-luokka tarjoaa käteviä menetelmiä kokoelmien käsittelyyn Javassa, mikä yksinkertaistaa yleisiä operaatioita. Synkronoidut kokoelmat, jotka luodaan Collections-menetelmillä, ovat hyödyllisiä säieturvallisuuden kannalta, mutta monimutkaisemmissa rinnakkaisohjelmoinnin tehtävissä on parempi käyttää java.util.concurrent-paketin kokoelmia.

1. Mitä menetelmää Collections-luokassa käytetään luomaan muuttumaton lista?

2. Mikä seuraavista Collections-luokan menetelmistä palauttaa säieturvallisen mapin?

3. Mikä on ero ConcurrentHashMapin ja synchronizedMapin välillä?

question mark

Mitä menetelmää Collections-luokassa käytetään luomaan muuttumaton lista?

Select the correct answer

question mark

Mikä seuraavista Collections-luokan menetelmistä palauttaa säieturvallisen mapin?

Select the correct answer

question mark

Mikä on ero ConcurrentHashMapin ja synchronizedMapin välillä?

Select the correct answer

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 2. Luku 8
some-alt