Esimerkkejä Kokoelmien Metodien Käytöstä
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
1List<Object> listSync = Collections.synchronizedList(new ArrayList<>());
synchronizedSet(Set<T> set): Palauttaa synkronoidun (säikeiturvallisen) joukon, joka noudattaa samaa sopimusta kuin annettu joukko.
Main.java
1Set<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
1Map<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
123456789101112131415package 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
12345678910111213package 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
12345678910111213package 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ä:
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ä?
Kiitos palautteestasi!
Kysy tekoälyä
Kysy tekoälyä
Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme
Awesome!
Completion rate improved to 3.33
Esimerkkejä Kokoelmien Metodien Käytöstä
Pyyhkäise näyttääksesi valikon
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
1List<Object> listSync = Collections.synchronizedList(new ArrayList<>());
synchronizedSet(Set<T> set): Palauttaa synkronoidun (säikeiturvallisen) joukon, joka noudattaa samaa sopimusta kuin annettu joukko.
Main.java
1Set<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
1Map<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
123456789101112131415package 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
12345678910111213package 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
12345678910111213package 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ä:
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ä?
Kiitos palautteestasi!