Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lære Concurrentmap og Dets Implementeringer | Synchroniserede Samlinger
Multitrådning i Java

bookConcurrentmap og Dets Implementeringer

Virkeligt eksempel

En webapplikation anvender ConcurrentMap til at cache ofte forespurgte data såsom brugersessioner. Forskellige tråde kan samtidig opdatere og læse data fra kortet, hvilket sikrer hurtig adgang og sikre operationer.

Forskelle fra andre typer

  • Sikkerhed i et multitrådet miljø: ConcurrentMap håndterer automatisk synkronisering af dataadgang, mens denne opgave i en konventionel Map skal udføres manuelt;
  • Effektivitet: Muliggør læsning og skrivning af data parallelt uden at låse hele datastrukturen.

ConcurrentMap-implementeringer

ConcurrentHashMap: Understøtter effektivt flere tråde ved at opdele kortet i segmenter (buckets), hvilket muliggør parallel udførelse af operationer uden at låse hele kortet.

Syntaks

Main.java

Main.java

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

ConcurrentHashMap i Java opdeler data i flere buckets, som hver især håndteres af en separat monitor. Denne struktur muliggør, at forskellige tråde kan ændre eller læse data fra forskellige buckets samtidigt, hvilket forbedrer ydelsen.

Tråde kan tilgå buckets parallelt, hvilket reducerer låse og undgår dataræs.

Hver bucket indeholder poster i form af nøgle-værdi-par, som kan organiseres som linkede lister.

ConcurrentSkipListMap: En skip-list-baseret implementering, der understøtter sorteret nøgleorden. Giver hurtig indsættelse, sletning og adgang til data i et multitrådet miljø.

Syntaks

Main.java

Main.java

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

📝Indsættelse: Når et nyt element tilføjes til ConcurrentSkipListMap, starter det på det laveste niveau. Det bevæger sig derefter opad gennem niveauerne, indtil det er placeret, hvor dets nøgler og værdier er i korrekt rækkefølge.

🔍Søgning: For at finde et element efter nøgle starter ConcurrentSkipListMap ved hovednoden på øverste niveau. Den følger markørerne, indtil den finder en node med en nøgle, der er lig med eller større end søgenøglen.

❌Sletning: For at slette et element fra ConcurrentSkipListMap fjernes det først fra det laveste niveau. Det nedgraderes derefter gennem niveauerne, indtil det er fjernet fra det sted, hvor dets nøgler og værdier er korrekt ordnet.

Eksempel på brug af ConcurrentMap i kode

Vigtigste metoder

putIfAbsent(K key, V value): Tilføjer et nøgle-værdi-par til mappet kun hvis nøglen ikke allerede findes.

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): Fjerner nøgle-værdi-parret, hvis nøglen er knyttet til den angivne værdi.

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): Erstatter posten for en nøgle kun hvis den i øjeblikket er knyttet til en værdi.

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): Beregner en ny værdi for den angivne nøgle ved hjælp af den givne remapping-funktion, hvilket kan indebære oprettelse af en ny værdi, ændring eller fjernelse af den eksisterende værdi.

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): Sammenfletter den angivne værdi med den eksisterende værdi tilknyttet nøglen ved hjælp af den angivne remapping-funktion, hvilket understøtter aggregering af data.

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) - returnerer værdien tilknyttet den angivne nøgle, eller standardværdien hvis nøglen ikke er til stede.

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

😔 Begrænsninger

En af de mulige ulemper er ustabil rækkefølge, da nogle implementeringer muligvis ikke garanterer rækkefølgen af elementer under iteration. Derudover kan der være begrænset understøttelse af visse operationer; for eksempel er atomare betingede opdateringer muligvis ikke fuldt understøttet i nogle implementeringer.

💪 Fordele

På den positive side er høj ydeevne en væsentlig fordel, hvilket gør det velegnet til scenarier med intensive læse- og skriveoperationer. Det tilbyder også nem anvendelse, hvilket markant reducerer behovet for manuel synkroniseringsstyring i et multitrådet miljø.

1. Hvad er formålet med ConcurrentMap?

2. Hvilken af følgende er en trådsikker implementering af ConcurrentMap?

3. Hvordan sikrer ConcurrentHashMap trådsikkerhed?

question mark

Hvad er formålet med ConcurrentMap?

Select the correct answer

question mark

Hvilken af følgende er en trådsikker implementering af ConcurrentMap?

Select the correct answer

question mark

Hvordan sikrer ConcurrentHashMap trådsikkerhed?

Select the correct answer

Var alt klart?

Hvordan kan vi forbedre det?

Tak for dine kommentarer!

Sektion 2. Kapitel 5

Spørg AI

expand

Spørg AI

ChatGPT

Spørg om hvad som helst eller prøv et af de foreslåede spørgsmål for at starte vores chat

Awesome!

Completion rate improved to 3.33

bookConcurrentmap og Dets Implementeringer

Stryg for at vise menuen

Virkeligt eksempel

En webapplikation anvender ConcurrentMap til at cache ofte forespurgte data såsom brugersessioner. Forskellige tråde kan samtidig opdatere og læse data fra kortet, hvilket sikrer hurtig adgang og sikre operationer.

Forskelle fra andre typer

  • Sikkerhed i et multitrådet miljø: ConcurrentMap håndterer automatisk synkronisering af dataadgang, mens denne opgave i en konventionel Map skal udføres manuelt;
  • Effektivitet: Muliggør læsning og skrivning af data parallelt uden at låse hele datastrukturen.

ConcurrentMap-implementeringer

ConcurrentHashMap: Understøtter effektivt flere tråde ved at opdele kortet i segmenter (buckets), hvilket muliggør parallel udførelse af operationer uden at låse hele kortet.

Syntaks

Main.java

Main.java

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

ConcurrentHashMap i Java opdeler data i flere buckets, som hver især håndteres af en separat monitor. Denne struktur muliggør, at forskellige tråde kan ændre eller læse data fra forskellige buckets samtidigt, hvilket forbedrer ydelsen.

Tråde kan tilgå buckets parallelt, hvilket reducerer låse og undgår dataræs.

Hver bucket indeholder poster i form af nøgle-værdi-par, som kan organiseres som linkede lister.

ConcurrentSkipListMap: En skip-list-baseret implementering, der understøtter sorteret nøgleorden. Giver hurtig indsættelse, sletning og adgang til data i et multitrådet miljø.

Syntaks

Main.java

Main.java

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

📝Indsættelse: Når et nyt element tilføjes til ConcurrentSkipListMap, starter det på det laveste niveau. Det bevæger sig derefter opad gennem niveauerne, indtil det er placeret, hvor dets nøgler og værdier er i korrekt rækkefølge.

🔍Søgning: For at finde et element efter nøgle starter ConcurrentSkipListMap ved hovednoden på øverste niveau. Den følger markørerne, indtil den finder en node med en nøgle, der er lig med eller større end søgenøglen.

❌Sletning: For at slette et element fra ConcurrentSkipListMap fjernes det først fra det laveste niveau. Det nedgraderes derefter gennem niveauerne, indtil det er fjernet fra det sted, hvor dets nøgler og værdier er korrekt ordnet.

Eksempel på brug af ConcurrentMap i kode

Vigtigste metoder

putIfAbsent(K key, V value): Tilføjer et nøgle-værdi-par til mappet kun hvis nøglen ikke allerede findes.

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): Fjerner nøgle-værdi-parret, hvis nøglen er knyttet til den angivne værdi.

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): Erstatter posten for en nøgle kun hvis den i øjeblikket er knyttet til en værdi.

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): Beregner en ny værdi for den angivne nøgle ved hjælp af den givne remapping-funktion, hvilket kan indebære oprettelse af en ny værdi, ændring eller fjernelse af den eksisterende værdi.

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): Sammenfletter den angivne værdi med den eksisterende værdi tilknyttet nøglen ved hjælp af den angivne remapping-funktion, hvilket understøtter aggregering af data.

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) - returnerer værdien tilknyttet den angivne nøgle, eller standardværdien hvis nøglen ikke er til stede.

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

😔 Begrænsninger

En af de mulige ulemper er ustabil rækkefølge, da nogle implementeringer muligvis ikke garanterer rækkefølgen af elementer under iteration. Derudover kan der være begrænset understøttelse af visse operationer; for eksempel er atomare betingede opdateringer muligvis ikke fuldt understøttet i nogle implementeringer.

💪 Fordele

På den positive side er høj ydeevne en væsentlig fordel, hvilket gør det velegnet til scenarier med intensive læse- og skriveoperationer. Det tilbyder også nem anvendelse, hvilket markant reducerer behovet for manuel synkroniseringsstyring i et multitrådet miljø.

1. Hvad er formålet med ConcurrentMap?

2. Hvilken af følgende er en trådsikker implementering af ConcurrentMap?

3. Hvordan sikrer ConcurrentHashMap trådsikkerhed?

question mark

Hvad er formålet med ConcurrentMap?

Select the correct answer

question mark

Hvilken af følgende er en trådsikker implementering af ConcurrentMap?

Select the correct answer

question mark

Hvordan sikrer ConcurrentHashMap trådsikkerhed?

Select the correct answer

Var alt klart?

Hvordan kan vi forbedre det?

Tak for dine kommentarer!

Sektion 2. Kapitel 5
some-alt