Java ConcurrentMap beheersen: Thread-veilige Maps uitgelegd
Java ConcurrentMap-interface
Leer hoe Java's ConcurrentMap thread-veilige map-operaties levert, de kernmethoden en een hands-on voorbeeld met ConcurrentHashMap.
De ConcurrentMap-interface extends java.util.Map en biedt een hoog-concurrente, thread-veilige implementatie van een map. Het garandeert dat meerdere threads gelijktijdig lees-, schrijf- en update-operaties kunnen uitvoeren zonder de interne staat van de map te corrumperen.
Omdat ConcurrentMap een interface is, kun je het niet direct instantiëren. De meest voorkomende implementatie is java.util.concurrent.ConcurrentHashMap, die lock-vrije reads en fijnmazig locking voor updates biedt.
Klassen die ConcurrentMap implementeren
Hoewel ConcurrentMap zelf niet geïnstantieerd kan worden, kun je een concrete map aanmaken door een van de implementaties te gebruiken. De de-facto standaard is ConcurrentHashMap, maar alternatieven zoals ConcurrentSkipListMap bestaan voor gesorteerde map-vereisten.

ConcurrentMap gebruiken
Eerst de interface importeren:
import java.util.concurrent.ConcurrentMap;
Maak dan een instantie van ConcurrentHashMap:
ConcurrentMap<String, Integer> numbers = new ConcurrentHashMap<>();
In dit voorbeeld is numbers een thread-veilige map waarbij elke String-key gepaard is met een Integer-waarde.
Kernconcepten:
- Key – een unieke identifier die mapt naar een waarde.
- Value – de data geassocieerd met een key.
Belangrijkste methoden van ConcurrentMap
Naast alle standaard Map-operaties introduceert ConcurrentMap diverse atomische, lock-vrije methoden:
- putIfAbsent(K key, V value) – Voegt het key/value-paar alleen toe als de key nog niet aanwezig is.
- compute(K key, BiFunction) – Werkt atomisch de waarde bij voor de gespecificeerde key gebaseerd op de huidige waarde.
- computeIfAbsent(K key, Function) – Genereert een waarde voor een ontbrekende key met een meegeleverde functie.
- computeIfPresent(K key, BiFunction) – Werkt de waarde van een bestaande key atomisch bij.
- forEach(BiConsumer) – Voert de gegeven actie uit voor elke entry.
- merge(K key, V value, BiFunction) – Combineert de nieuwe waarde met de bestaande waarde met de meegeleverde functie.
Voor een diepere referentie, zie de officiële Java-documentatie.
ConcurrentHashMap gebruiken met ConcurrentMap
import java.util.concurrent.ConcurrentMap; import java.util.concurrent.ConcurrentHashMap; public class Main { public static void main(String[] args) { // Maak een thread-veilige map ConcurrentMap<String, Integer> numbers = new ConcurrentHashMap<>(); // Voeg elementen toe numbers.put("Two", 2); numbers.put("One", 1); numbers.put("Three", 3); System.out.println("ConcurrentMap: " + numbers); // Haal een waarde op int value = numbers.get("One"); System.out.println("Toegankelijke waarde: " + value); // Verwijder een key/value-paar int removed = numbers.remove("Two"); System.out.println("Verwijderde waarde: " + removed); } }
Output
ConcurrentMap: {One=1, Two=2, Three=3} Toegankelijke waarde: 1 Verwijderde waarde: 2
Voor geavanceerder gebruik, raadpleeg de ConcurrentHashMap-documentatie.
Java
- C#-interfaces onder de knie: definitie, implementatie en praktische use cases
- Java-operators beheersen: typen, syntax en praktische voorbeelden
- Java's super-sleutelwoord meesteren: geavanceerd gebruik & praktische voorbeelden
- Java interfaces meesteren: concepten, implementatie en best practices
- Java Try-with-resources meesteren: automatische resource management uitgelegd
- Java NavigableSet interface: Navigatie, sortering en praktische voorbeelden
- Java Lambda-expressies: Van basis tot Stream API
- Interface vs Abstracte Klasse in Java: De Juiste Abstractie Kiezen
- Java Interfaces begrijpen: Definities, Gebruik en Best Practices
- Java 9 Private Interface Methods: Encapsulatie & herbruik verbeteren
- Java 8 Optional onder de knie krijgen: Praktische gids voor null-veilige code