Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Leer Concurrentmap en de Implementaties Ervan | Gesynchroniseerde Collecties
Multithreading in Java

bookConcurrentmap en de Implementaties Ervan

Praktijkvoorbeeld

Een webapplicatie gebruikt ConcurrentMap om vaak opgevraagde gegevens zoals gebruikerssessies te cachen. Verschillende threads kunnen gelijktijdig gegevens bijwerken en lezen uit de map, wat zorgt voor snelle toegang en veilige bewerkingen.

Verschillen met andere typen

  • Beveiliging in een multithreaded omgeving: ConcurrentMap regelt automatisch de synchronisatie van gegevensbenaderingen, terwijl dit bij een conventionele Map handmatig moet gebeuren;
  • Efficiëntie: Maakt het mogelijk om gegevens te lezen en te schrijven in parallel zonder de gehele datastructuur te vergrendelen.

ConcurrentMap-implementaties

ConcurrentHashMap: Ondersteunt efficiënt meerdere threads door de map op te delen in segmenten (buckets), waardoor parallelle uitvoering van bewerkingen mogelijk is zonder de gehele map te vergrendelen.

Syntax

Main.java

Main.java

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

ConcurrentHashMap in Java verdeelt gegevens in meerdere buckets, elk beheerd door een aparte monitor. Deze opzet maakt het mogelijk dat verschillende threads gelijktijdig gegevens uit verschillende buckets kunnen lezen of wijzigen, wat de prestaties verbetert.

Threads kunnen parallel toegang krijgen tot buckets, waardoor vergrendelingen worden verminderd en data races worden voorkomen.

Elke bucket bevat records in de vorm van key-value paren, die kunnen worden georganiseerd als linked lists.

ConcurrentSkipListMap: Een implementatie op basis van een skip-list die gesorteerde sleutelvolgorde ondersteunt. Biedt snelle invoeging, verwijdering en toegang tot gegevens in een multithreaded omgeving.

Syntax

Main.java

Main.java

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

📝Invoegen: Wanneer een nieuw item wordt toegevoegd aan ConcurrentSkipListMap, begint het op het laagste niveau. Vervolgens beweegt het omhoog door de niveaus totdat het geplaatst is waar de sleutels en waarden in de juiste volgorde staan.

🔍Zoeken: Om een item te vinden op basis van de sleutel, begint ConcurrentSkipListMap bij de kopnode van het hoogste niveau. Het volgt de pointers totdat het een node vindt met een sleutel die gelijk is aan of groter is dan de gezochte sleutel.

❌Verwijderen: Om een item uit ConcurrentSkipListMap te verwijderen, wordt het eerst verwijderd uit het laagste niveau. Vervolgens wordt het afgebouwd door de niveaus totdat het verwijderd is van de plaatsen waar de sleutels en waarden correct geordend zijn.

Voorbeeld van het gebruik van ConcurrentMap in code

Belangrijkste methoden

putIfAbsent(K key, V value): Voegt een sleutel-waarde paar toe aan de map alleen als de sleutel nog niet aanwezig is.

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): Verwijdert het sleutel-waarde-paar als de sleutel is gekoppeld aan de opgegeven waarde.

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): Vervangt de invoer voor een sleutel alleen als deze momenteel aan een waarde is gekoppeld.

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): Berekent een nieuwe waarde voor de opgegeven sleutel met behulp van de opgegeven remapping-functie, wat kan inhouden dat er een nieuwe waarde wordt aangemaakt, een bestaande waarde wordt aangepast of verwijderd.

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): Voegt de gegeven waarde samen met de bestaande waarde die aan de sleutel is gekoppeld, met behulp van de opgegeven remappingfunctie, wat helpt bij het aggregeren van gegevens.

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) - retourneert de waarde die is gekoppeld aan de opgegeven sleutel, of de standaardwaarde als de sleutel niet aanwezig is.

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

😔 Beperkingen

Een van de mogelijke nadelen is instabiliteit van de volgorde, omdat sommige implementaties mogelijk geen volgorde van elementen tijdens iteratie garanderen. Daarnaast kan er beperkte ondersteuning zijn voor bepaalde bewerkingen; bijvoorbeeld, atomische voorwaardelijke updates worden mogelijk niet volledig ondersteund in sommige implementaties.

💪 Voordelen

Aan de positieve kant is hoge prestaties een belangrijk voordeel, waardoor het zeer geschikt is voor scenario's met intensieve lees- en schrijfbewerkingen. Het biedt ook gebruiksgemak, waardoor de noodzaak voor handmatig synchronisatiebeheer in een multithreaded omgeving aanzienlijk wordt verminderd.

1. Wat is het doel van ConcurrentMap?

2. Welke van de volgende is een thread-veilige implementatie van ConcurrentMap?

3. Hoe zorgt ConcurrentHashMap voor thread-veiligheid?

question mark

Wat is het doel van ConcurrentMap?

Select the correct answer

question mark

Welke van de volgende is een thread-veilige implementatie van ConcurrentMap?

Select the correct answer

question mark

Hoe zorgt ConcurrentHashMap voor thread-veiligheid?

Select the correct answer

Was alles duidelijk?

Hoe kunnen we het verbeteren?

Bedankt voor je feedback!

Sectie 2. Hoofdstuk 5

Vraag AI

expand

Vraag AI

ChatGPT

Vraag wat u wilt of probeer een van de voorgestelde vragen om onze chat te starten.

Awesome!

Completion rate improved to 3.33

bookConcurrentmap en de Implementaties Ervan

Veeg om het menu te tonen

Praktijkvoorbeeld

Een webapplicatie gebruikt ConcurrentMap om vaak opgevraagde gegevens zoals gebruikerssessies te cachen. Verschillende threads kunnen gelijktijdig gegevens bijwerken en lezen uit de map, wat zorgt voor snelle toegang en veilige bewerkingen.

Verschillen met andere typen

  • Beveiliging in een multithreaded omgeving: ConcurrentMap regelt automatisch de synchronisatie van gegevensbenaderingen, terwijl dit bij een conventionele Map handmatig moet gebeuren;
  • Efficiëntie: Maakt het mogelijk om gegevens te lezen en te schrijven in parallel zonder de gehele datastructuur te vergrendelen.

ConcurrentMap-implementaties

ConcurrentHashMap: Ondersteunt efficiënt meerdere threads door de map op te delen in segmenten (buckets), waardoor parallelle uitvoering van bewerkingen mogelijk is zonder de gehele map te vergrendelen.

Syntax

Main.java

Main.java

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

ConcurrentHashMap in Java verdeelt gegevens in meerdere buckets, elk beheerd door een aparte monitor. Deze opzet maakt het mogelijk dat verschillende threads gelijktijdig gegevens uit verschillende buckets kunnen lezen of wijzigen, wat de prestaties verbetert.

Threads kunnen parallel toegang krijgen tot buckets, waardoor vergrendelingen worden verminderd en data races worden voorkomen.

Elke bucket bevat records in de vorm van key-value paren, die kunnen worden georganiseerd als linked lists.

ConcurrentSkipListMap: Een implementatie op basis van een skip-list die gesorteerde sleutelvolgorde ondersteunt. Biedt snelle invoeging, verwijdering en toegang tot gegevens in een multithreaded omgeving.

Syntax

Main.java

Main.java

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

📝Invoegen: Wanneer een nieuw item wordt toegevoegd aan ConcurrentSkipListMap, begint het op het laagste niveau. Vervolgens beweegt het omhoog door de niveaus totdat het geplaatst is waar de sleutels en waarden in de juiste volgorde staan.

🔍Zoeken: Om een item te vinden op basis van de sleutel, begint ConcurrentSkipListMap bij de kopnode van het hoogste niveau. Het volgt de pointers totdat het een node vindt met een sleutel die gelijk is aan of groter is dan de gezochte sleutel.

❌Verwijderen: Om een item uit ConcurrentSkipListMap te verwijderen, wordt het eerst verwijderd uit het laagste niveau. Vervolgens wordt het afgebouwd door de niveaus totdat het verwijderd is van de plaatsen waar de sleutels en waarden correct geordend zijn.

Voorbeeld van het gebruik van ConcurrentMap in code

Belangrijkste methoden

putIfAbsent(K key, V value): Voegt een sleutel-waarde paar toe aan de map alleen als de sleutel nog niet aanwezig is.

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): Verwijdert het sleutel-waarde-paar als de sleutel is gekoppeld aan de opgegeven waarde.

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): Vervangt de invoer voor een sleutel alleen als deze momenteel aan een waarde is gekoppeld.

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): Berekent een nieuwe waarde voor de opgegeven sleutel met behulp van de opgegeven remapping-functie, wat kan inhouden dat er een nieuwe waarde wordt aangemaakt, een bestaande waarde wordt aangepast of verwijderd.

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): Voegt de gegeven waarde samen met de bestaande waarde die aan de sleutel is gekoppeld, met behulp van de opgegeven remappingfunctie, wat helpt bij het aggregeren van gegevens.

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) - retourneert de waarde die is gekoppeld aan de opgegeven sleutel, of de standaardwaarde als de sleutel niet aanwezig is.

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

😔 Beperkingen

Een van de mogelijke nadelen is instabiliteit van de volgorde, omdat sommige implementaties mogelijk geen volgorde van elementen tijdens iteratie garanderen. Daarnaast kan er beperkte ondersteuning zijn voor bepaalde bewerkingen; bijvoorbeeld, atomische voorwaardelijke updates worden mogelijk niet volledig ondersteund in sommige implementaties.

💪 Voordelen

Aan de positieve kant is hoge prestaties een belangrijk voordeel, waardoor het zeer geschikt is voor scenario's met intensieve lees- en schrijfbewerkingen. Het biedt ook gebruiksgemak, waardoor de noodzaak voor handmatig synchronisatiebeheer in een multithreaded omgeving aanzienlijk wordt verminderd.

1. Wat is het doel van ConcurrentMap?

2. Welke van de volgende is een thread-veilige implementatie van ConcurrentMap?

3. Hoe zorgt ConcurrentHashMap voor thread-veiligheid?

question mark

Wat is het doel van ConcurrentMap?

Select the correct answer

question mark

Welke van de volgende is een thread-veilige implementatie van ConcurrentMap?

Select the correct answer

question mark

Hoe zorgt ConcurrentHashMap voor thread-veiligheid?

Select the correct answer

Was alles duidelijk?

Hoe kunnen we het verbeteren?

Bedankt voor je feedback!

Sectie 2. Hoofdstuk 5
some-alt