Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Oppiskele Concurrentmap ja Sen Toteutukset | Synkronoidut Kokoelmat
Monisäikeisyys Javassa

bookConcurrentmap ja Sen Toteutukset

Käytännön esimerkki

Verkkosovellus käyttää ConcurrentMap-rakennetta välimuistina usein pyydetylle tiedolle, kuten käyttäjäistunnoille. Eri säikeet voivat samanaikaisesti päivittää ja lukea tietoja mapista, mikä takaa nopean pääsyn ja turvalliset toiminnot.

Erot muihin tyyppeihin

  • Turvallisuus monisäikeisessä ympäristössä: ConcurrentMap huolehtii automaattisesti datan synkronoinnista, kun taas tavallisessa Map-rakenteessa tämä täytyy tehdä manuaalisesti;
  • Tehokkuus: Mahdollistaa datan luku- ja kirjoitusoperaatiot rinnakkain ilman, että koko tietorakennetta lukitaan.

ConcurrentMap-toteutukset

ConcurrentHashMap: Tukee tehokkaasti useita säikeitä jakamalla mapin segmentteihin (bucketit), mahdollistaen rinnakkaiset operaatiot ilman koko mapin lukitsemista.

Syntaksi

Main.java

Main.java

copy
1
ConcurrentMap<Integer, Integer> concurrentHashMap = new ConcurrentHashMap<>();

ConcurrentHashMap jakaa tiedot useisiin säiliöihin (buckets), joista jokaista hallitsee erillinen monitori. Tämä rakenne mahdollistaa eri säikeiden muokata tai lukea tietoja eri säiliöistä samanaikaisesti, mikä parantaa suorituskykyä.

Säikeet voivat käyttää säiliöitä rinnakkain, mikä vähentää lukkojen tarvetta ja ehkäisee kilpailevia tilanteita.

Jokainen säiliö sisältää tietueita avain-arvo -pareina, jotka voidaan järjestää linkitettyihin listoihin.

ConcurrentSkipListMap: Skip-list-pohjainen toteutus, joka tukee lajiteltua avainten järjestystä. Tarjoaa nopean lisäyksen, poiston ja tietojen haun monisäikeisessä ympäristössä.

Syntaksi

Main.java

Main.java

copy
1
ConcurrentMap<Integer, Integer> concurrentSkipListMap = new ConcurrentSkipListMap<>();

📝Lisäys: Kun uusi alkio lisätään ConcurrentSkipListMap-kokoelmaan, se sijoitetaan alimmalle tasolle. Tämän jälkeen se siirtyy ylöspäin tasoja pitkin, kunnes se on sijoitettu kohtaan, jossa sen avaimet ja arvot ovat oikeassa järjestyksessä.

🔍Haku: Kun alkiota etsitään avaimen perusteella, ConcurrentSkipListMap aloittaa haun ylimmän tason pääsolmusta. Se seuraa osoittimia, kunnes löytää solmun, jonka avain on yhtä suuri tai suurempi kuin etsittävä avain.

❌Poisto: Kun alkio poistetaan ConcurrentSkipListMap-kokoelmasta, se poistetaan ensin alimmalta tasolta. Sen jälkeen se alennetaan tasoja pitkin, kunnes se on poistettu kohdista, joissa sen avaimet ja arvot ovat oikeassa järjestyksessä.

Esimerkki ConcurrentMapin käytöstä koodissa

Pääasialliset metodit

putIfAbsent(K key, V value): Lisää avain-arvo-parin mapiin vain, jos avain ei ole jo olemassa.

Main.java

Main.java

copy
123
ConcurrentMap<String, Integer> map = new ConcurrentHashMap<>(); map.putIfAbsent("a", 1); // Adds the pair ("a", 1) to the map, as "a" is not already present map.putIfAbsent("a", 2); // Does not change the value, as "a" is already present in the map

remove(Object key, Object value): Poistaa avain-arvo-parin, jos avain on yhdistetty annettuun arvoon.

Main.java

Main.java

copy
1234
ConcurrentMap<String, Integer> map = new ConcurrentHashMap<>(); map.put("a", 1); map.remove("a", 1); // Removes the pair ("a", 1), as "a" is mapped to value 1 map.remove("a", 2); // Does nothing, as "a" is not mapped to value 2

replace(K key, V value): Korvaa avaimen arvon vain, jos se on tällä hetkellä yhdistetty johonkin arvoon.

Main.java

Main.java

copy
1234
ConcurrentMap<String, Integer> map = new ConcurrentHashMap<>(); map.put("a", 1); map.replace("a", 2); // Replaces the value 1 with 2 for key "a" map.replace("b", 3); // Does nothing, as "b" is not present

compute(K key, BiFunction<? super K,? super V,? extends V> remappingFunction): Laskee uuden arvon määritetylle avaimelle annetun uudelleenkartoitusfunktion avulla, mikä voi tarkoittaa uuden arvon luomista, muokkaamista tai olemassa olevan arvon poistamista.

Main.java

Main.java

copy
1234
ConcurrentMap<String, Integer> map = new ConcurrentHashMap<>(); map.put("a", 1); map.compute("a", (k, v) -> v == null ? 1 : v + 1); // Increases the value for key "a" by 1 map.compute("b", (k, v) -> v == null ? 1 : v + 1); // Sets the value to 1 for new key "b"

merge(K key, V value, BiFunction<? super V,? super V,? extends V> remappingFunction): Yhdistää annetun arvon olemassa olevaan avaimeen liitettyyn arvoon käyttäen annettua yhdistämisfunktiota, joka auttaa tietojen yhdistämisessä.

Main.java

Main.java

copy
1234
ConcurrentMap<String, Integer> map = new ConcurrentHashMap<>(); map.put("a", 1); map.merge("a", 2, Integer::sum); // Sums the current value (1) with the new value (2), resulting in 3 map.merge("b", 2, Integer::sum); // Sets the value to 2 for new key "b"

getOrDefault(Object key, V defaultValue) - palauttaa arvon, joka on liitetty annettuun avaimeen, tai oletusarvon, jos avainta ei löydy.

Main.java

Main.java

copy
1234
ConcurrentMap<String, Integer> map = new ConcurrentHashMap<>(); map.put("a", 1); int value1 = map.getOrDefault("a", 0); // Returns 1, as "a" is present int value2 = map.getOrDefault("b", 0); // Returns 0, as "b" is not present

😔 Rajoitukset

Yksi mahdollisista haitoista on järjestyksen epävakaus, sillä jotkin toteutukset eivät välttämättä takaa alkioiden järjestystä iteraation aikana. Lisäksi tietyissä toiminnoissa voi olla rajoitettu tuki; esimerkiksi atomisia ehdollisia päivityksiä ei välttämättä tueta kaikissa toteutuksissa.

💪 Edut

Positiivisena puolena korkea suorituskyky on merkittävä etu, mikä tekee siitä hyvin soveltuvan tilanteisiin, joissa on intensiivisiä luku- ja kirjoitusoperaatioita. Lisäksi se tarjoaa helppokäyttöisyyttä, mikä vähentää merkittävästi tarvetta manuaaliselle synkronoinnin hallinnalle monisäikeisessä ympäristössä.

1. Mikä on ConcurrentMapin tarkoitus?

2. Mikä seuraavista on säieturvallinen ConcurrentMap-toteutus?

3. Miten ConcurrentHashMap varmistaa säieturvallisuuden?

question mark

Mikä on ConcurrentMapin tarkoitus?

Select the correct answer

question mark

Mikä seuraavista on säieturvallinen ConcurrentMap-toteutus?

Select the correct answer

question mark

Miten ConcurrentHashMap varmistaa säieturvallisuuden?

Select the correct answer

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 2. Luku 5

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

bookConcurrentmap ja Sen Toteutukset

Pyyhkäise näyttääksesi valikon

Käytännön esimerkki

Verkkosovellus käyttää ConcurrentMap-rakennetta välimuistina usein pyydetylle tiedolle, kuten käyttäjäistunnoille. Eri säikeet voivat samanaikaisesti päivittää ja lukea tietoja mapista, mikä takaa nopean pääsyn ja turvalliset toiminnot.

Erot muihin tyyppeihin

  • Turvallisuus monisäikeisessä ympäristössä: ConcurrentMap huolehtii automaattisesti datan synkronoinnista, kun taas tavallisessa Map-rakenteessa tämä täytyy tehdä manuaalisesti;
  • Tehokkuus: Mahdollistaa datan luku- ja kirjoitusoperaatiot rinnakkain ilman, että koko tietorakennetta lukitaan.

ConcurrentMap-toteutukset

ConcurrentHashMap: Tukee tehokkaasti useita säikeitä jakamalla mapin segmentteihin (bucketit), mahdollistaen rinnakkaiset operaatiot ilman koko mapin lukitsemista.

Syntaksi

Main.java

Main.java

copy
1
ConcurrentMap<Integer, Integer> concurrentHashMap = new ConcurrentHashMap<>();

ConcurrentHashMap jakaa tiedot useisiin säiliöihin (buckets), joista jokaista hallitsee erillinen monitori. Tämä rakenne mahdollistaa eri säikeiden muokata tai lukea tietoja eri säiliöistä samanaikaisesti, mikä parantaa suorituskykyä.

Säikeet voivat käyttää säiliöitä rinnakkain, mikä vähentää lukkojen tarvetta ja ehkäisee kilpailevia tilanteita.

Jokainen säiliö sisältää tietueita avain-arvo -pareina, jotka voidaan järjestää linkitettyihin listoihin.

ConcurrentSkipListMap: Skip-list-pohjainen toteutus, joka tukee lajiteltua avainten järjestystä. Tarjoaa nopean lisäyksen, poiston ja tietojen haun monisäikeisessä ympäristössä.

Syntaksi

Main.java

Main.java

copy
1
ConcurrentMap<Integer, Integer> concurrentSkipListMap = new ConcurrentSkipListMap<>();

📝Lisäys: Kun uusi alkio lisätään ConcurrentSkipListMap-kokoelmaan, se sijoitetaan alimmalle tasolle. Tämän jälkeen se siirtyy ylöspäin tasoja pitkin, kunnes se on sijoitettu kohtaan, jossa sen avaimet ja arvot ovat oikeassa järjestyksessä.

🔍Haku: Kun alkiota etsitään avaimen perusteella, ConcurrentSkipListMap aloittaa haun ylimmän tason pääsolmusta. Se seuraa osoittimia, kunnes löytää solmun, jonka avain on yhtä suuri tai suurempi kuin etsittävä avain.

❌Poisto: Kun alkio poistetaan ConcurrentSkipListMap-kokoelmasta, se poistetaan ensin alimmalta tasolta. Sen jälkeen se alennetaan tasoja pitkin, kunnes se on poistettu kohdista, joissa sen avaimet ja arvot ovat oikeassa järjestyksessä.

Esimerkki ConcurrentMapin käytöstä koodissa

Pääasialliset metodit

putIfAbsent(K key, V value): Lisää avain-arvo-parin mapiin vain, jos avain ei ole jo olemassa.

Main.java

Main.java

copy
123
ConcurrentMap<String, Integer> map = new ConcurrentHashMap<>(); map.putIfAbsent("a", 1); // Adds the pair ("a", 1) to the map, as "a" is not already present map.putIfAbsent("a", 2); // Does not change the value, as "a" is already present in the map

remove(Object key, Object value): Poistaa avain-arvo-parin, jos avain on yhdistetty annettuun arvoon.

Main.java

Main.java

copy
1234
ConcurrentMap<String, Integer> map = new ConcurrentHashMap<>(); map.put("a", 1); map.remove("a", 1); // Removes the pair ("a", 1), as "a" is mapped to value 1 map.remove("a", 2); // Does nothing, as "a" is not mapped to value 2

replace(K key, V value): Korvaa avaimen arvon vain, jos se on tällä hetkellä yhdistetty johonkin arvoon.

Main.java

Main.java

copy
1234
ConcurrentMap<String, Integer> map = new ConcurrentHashMap<>(); map.put("a", 1); map.replace("a", 2); // Replaces the value 1 with 2 for key "a" map.replace("b", 3); // Does nothing, as "b" is not present

compute(K key, BiFunction<? super K,? super V,? extends V> remappingFunction): Laskee uuden arvon määritetylle avaimelle annetun uudelleenkartoitusfunktion avulla, mikä voi tarkoittaa uuden arvon luomista, muokkaamista tai olemassa olevan arvon poistamista.

Main.java

Main.java

copy
1234
ConcurrentMap<String, Integer> map = new ConcurrentHashMap<>(); map.put("a", 1); map.compute("a", (k, v) -> v == null ? 1 : v + 1); // Increases the value for key "a" by 1 map.compute("b", (k, v) -> v == null ? 1 : v + 1); // Sets the value to 1 for new key "b"

merge(K key, V value, BiFunction<? super V,? super V,? extends V> remappingFunction): Yhdistää annetun arvon olemassa olevaan avaimeen liitettyyn arvoon käyttäen annettua yhdistämisfunktiota, joka auttaa tietojen yhdistämisessä.

Main.java

Main.java

copy
1234
ConcurrentMap<String, Integer> map = new ConcurrentHashMap<>(); map.put("a", 1); map.merge("a", 2, Integer::sum); // Sums the current value (1) with the new value (2), resulting in 3 map.merge("b", 2, Integer::sum); // Sets the value to 2 for new key "b"

getOrDefault(Object key, V defaultValue) - palauttaa arvon, joka on liitetty annettuun avaimeen, tai oletusarvon, jos avainta ei löydy.

Main.java

Main.java

copy
1234
ConcurrentMap<String, Integer> map = new ConcurrentHashMap<>(); map.put("a", 1); int value1 = map.getOrDefault("a", 0); // Returns 1, as "a" is present int value2 = map.getOrDefault("b", 0); // Returns 0, as "b" is not present

😔 Rajoitukset

Yksi mahdollisista haitoista on järjestyksen epävakaus, sillä jotkin toteutukset eivät välttämättä takaa alkioiden järjestystä iteraation aikana. Lisäksi tietyissä toiminnoissa voi olla rajoitettu tuki; esimerkiksi atomisia ehdollisia päivityksiä ei välttämättä tueta kaikissa toteutuksissa.

💪 Edut

Positiivisena puolena korkea suorituskyky on merkittävä etu, mikä tekee siitä hyvin soveltuvan tilanteisiin, joissa on intensiivisiä luku- ja kirjoitusoperaatioita. Lisäksi se tarjoaa helppokäyttöisyyttä, mikä vähentää merkittävästi tarvetta manuaaliselle synkronoinnin hallinnalle monisäikeisessä ympäristössä.

1. Mikä on ConcurrentMapin tarkoitus?

2. Mikä seuraavista on säieturvallinen ConcurrentMap-toteutus?

3. Miten ConcurrentHashMap varmistaa säieturvallisuuden?

question mark

Mikä on ConcurrentMapin tarkoitus?

Select the correct answer

question mark

Mikä seuraavista on säieturvallinen ConcurrentMap-toteutus?

Select the correct answer

question mark

Miten ConcurrentHashMap varmistaa säieturvallisuuden?

Select the correct answer

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 2. Luku 5
some-alt