Tutorials  /  JavaScript

ConcurrentHashMap: Threadsicherheit und Flexibilität in Java

Ccentron Redaktion · Oktober 2024 ·3 Min. Lesezeit ·JavaScript, Tutorial

Die Klasse ConcurrentHashMap gehört zu den Concurrency Collection Classes in Java und bietet eine effektive Lösung zur Handhabung von Mehrfachzugriffen in einer multithreaded Umgebung. Sie basiert auf einer Hash-Tabellen-Implementierung, die gleichzeitige Lese- und Schreiboperationen unterstützt, ohne die Gefahr einer ConcurrentModificationException. Diese Flexibilität ist entscheidend für die Entwicklung moderner Anwendungen, die hohe Leistungsanforderungen haben.

Was ist eine ConcurrentHashMap?

Ein häufiges Problem in Java tritt auf, wenn man eine Sammlung während der Iteration modifiziert. Dies führt zu einer ConcurrentModificationException. Um diese Herausforderung zu bewältigen, wurden ab Java 1.5 Concurrent-Klassen im Paket java.util.concurrent eingeführt. Die ConcurrentHashMap erlaubt es, die Map während der Iteration zu modifizieren und garantiert, dass die Operationen threadsicher sind. Es ist wichtig zu beachten, dass ConcurrentHashMap keine null-Werte für Schlüssel und Werte zulässt. Dadurch wird sichergestellt, dass die Integrität der Daten während der gesamten Laufzeit gewahrt bleibt.

VM

Passende Infrastruktur bei centron

Node-Anwendungen wollen deployt werden: ccloud³ VMs mit vollem Root-Zugriff ab 3,12 € im Monat – oder gleich als Managed Server, wenn der Betrieb nicht bei Ihnen liegen soll. Cloud Server mieten →

Beispiel einer ConcurrentHashMap in Java

Die ConcurrentHashMap ist ähnlich wie die HashMap, jedoch mit dem entscheidenden Vorteil der Thread-Sicherheit und der Möglichkeit zur Modifikation während der Iteration. Diese Eigenschaften machen sie zu einem idealen Kandidaten für die Speicherung von Daten in Anwendungen, die hohe Anforderungen an die Parallelität stellen.

Hier ist ein einfaches Beispiel zur Veranschaulichung:

Go
package com.journaldev.util;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

public class ConcurrentHashMapExample {

    public static void main(String[] args) {
        // ConcurrentHashMap
        Map<String, String> myMap = new ConcurrentHashMap<String, String>();
        myMap.put("1", "1");
        myMap.put("2", "1");
        myMap.put("3", "1");
        myMap.put("4", "1");
        myMap.put("5", "1");
        myMap.put("6", "1");
        
        System.out.println("ConcurrentHashMap vor Iterator: " + myMap);
        Iterator it = myMap.keySet().iterator();

        while (it.hasNext()) {
            String key = it.next();
            if (key.equals("3")) myMap.put(key + "new", "new3");
        }
        System.out.println("ConcurrentHashMap nach Iterator: " + myMap);

        // HashMap
        myMap = new HashMap<String, String>();
        myMap.put("1", "1");
        myMap.put("2", "1");
        myMap.put("3", "1");
        myMap.put("4", "1");
        myMap.put("5", "1");
        myMap.put("6", "1");
        
        System.out.println("HashMap vor Iterator: " + myMap);
        Iterator it1 = myMap.keySet().iterator();

        while (it1.hasNext()) {
            String key = it1.next();
            if (key.equals("3")) myMap.put(key + "new", "new3");
        }
        System.out.println("HashMap nach Iterator: " + myMap);
    }
}

Ausgaben und Fehleranalyse

Die Ausgabe des obigen Codes zeigt, dass die ConcurrentHashMap erfolgreich einen neuen Eintrag während der Iteration hinzufügt, während die HashMap eine ConcurrentModificationException wirft.

Ausgabe:

Code
ConcurrentHashMap vor Iterator: {1=1, 5=1, 6=1, 3=1, 4=1, 2=1}
ConcurrentHashMap nach Iterator: {1=1, 3new=new3, 5=1, 6=1, 3=1, 4=1, 2=1}
HashMap vor Iterator: {3=1, 2=1, 1=1, 6=1, 5=1, 4=1}
Exception in thread "main" java.util.ConcurrentModificationException

Die ConcurrentModificationException tritt auf, weil der Iterator auf die Strukturänderung der HashMap reagiert, die während der Iteration erfolgt ist. Diese Ausnahme zeigt, wie wichtig es ist, die Funktionsweise von Sammlungen in Java zu verstehen.

Umgang mit Modifikationen in der Iteration

Wenn wir den Code so ändern, dass wir beim Einfügen eines neuen Eintrags aus der Iteration ausbrechen, vermeiden wir die Ausnahme:

Code
if (key.equals("3")) {
    myMap.put(key + "new", "new3");
    break;  // Brechen Sie die Schleife ab
}

Fazit

Die ConcurrentHashMap ist eine leistungsstarke und flexible Lösung für multithreaded Umgebungen in Java. Sie ermöglicht Modifikationen während der Iteration, ohne dass es zu Ausnahmen kommt, was sie ideal für Anwendungen macht, die eine hohe Leistung und Sicherheit benötigen. Außerdem ist es erwähnenswert, dass die Verwendung von Generics bei der Erstellung von Sammlungsobjekten in Java nicht nur die Typprüfung zur Compile-Zeit verbessert, sondern auch zur Vermeidung von ClassCastException zur Laufzeit beiträgt. Diese Vorteile machen die ConcurrentHashMap zu einem unverzichtbaren Werkzeug für Entwickler.

Jetzt 200 € Guthaben sichern

Testen Sie Ihr Setup auf ccloud³

Registrieren Sie sich in der ccloud³ und erhalten Sie 200 € Startguthaben für Ihr Projekt – z. B. für eine PostgreSQL-VM mit automatischen Backups.

centron Redaktion Technische Redaktion

Das Redaktionsteam von centron schreibt Anleitungen aus dem Betriebsalltag: getestet auf unserer eigenen Plattform, betrieben im Rechenzentrum in Hallstadt bei Bamberg.

Kategorie JavaScript
Teilen
Noch offene Fragen?

Our team will help you with your specific setup - in German or English, by people who run the platform themselves.

War dieses Tutorial hilfreich?

Your answer is stored anonymously and helps us improve our tutorials.

Kommentare

No comments yet - be the first to ask a question about this tutorial.

Sign in to comment

Comments are open to centron customers. Sign in to your account to ask a question about this tutorial.

Weiterlesen

Das könnte Sie auch interessieren

Jetzt kostenlos anfangen

Melden Sie sich an und erhalten Sie in den ersten 60 Tagen ein Guthaben von 200 € bei centron.

Dieses Werbeangebot gilt nur für neue Konten. Angebot ausschließlich für Gewerbetreibende.

Jetzt loslegen Sales kontaktieren