Synchronisierter Java-Block vs. concurrentHashMap vs Collections.synchronizedMap

8

Say Wenn ich eine synchronisierte Methode habe und innerhalb dieser Methode eine hashmap wie folgt aktualisiere:

%Vor%

Jetzt, während die Methode1 läuft und die Hashmap neu gefüllt wird, wenn andere Threads tring, um den Wert der Hashmap zu bekommen, nehme ich an, dass sie blockiert werden?

Nun, anstatt die sync-Methode zu verwenden, wenn ich hashmap auf ConcurrentHashMap wie unten ändere, was ist das Verhalten?

%Vor%

Was passiert, wenn ich Collections.synchronizedMap verwende? ist es das gleiche?

    
neo 27.09.2012, 19:20
quelle

3 Antworten

8

Wenn Sie möchten, dass alle Lese- und Schreibaktionen auf Ihre HashMap synchronisiert sind, müssen Sie synchronize auf alle Methoden setzen, die auf die HashMap zugreifen; Es ist nicht genug, nur eine Methode zu blockieren.

ConcurrentHashMap ermöglicht thread-sicheren Zugriff auf Ihre Daten ohne Sperren. Das bedeutet, dass Sie Werte in einem Thread hinzufügen / entfernen und gleichzeitig Werte in einem anderen Thread abrufen können, ohne dass eine Ausnahme auftritt. Siehe auch die Dokumentation von ConcurrentHashMap

    
Anna 27.09.2012, 19:30
quelle
11

CHM (ConcurrentHashMap), anstatt jede Methode für eine gemeinsame Sperre zu synchronisieren und den Zugriff auf einen einzelnen Thread zu beschränken Zu einem bestimmten Zeitpunkt wird ein feinkörnigerer Sperrmechanismus verwendet, der Lock-Striping genannt wird, um einen höheren Grad an gemeinsamem Zugriff zu ermöglichen. Beliebig viele Lese-Threads kann gleichzeitig auf die Karte zugreifen, die Leser können gleichzeitig auf die Karte zugreifen Schreiber und eine begrenzte Anzahl von Schreibern können die Karte gleichzeitig ändern. Das Ergebnis ist ein viel höherer Durchsatz bei gleichzeitigem Zugriff mit geringer Leistungseinbuße für Single-Thread-Zugriff. ConcurrentHashMap wird zusammen mit den anderen gleichzeitigen Sammlungen weiter verbessert die synchronisierten Auflistungsklassen durch Bereitstellen von Iteratoren, die nicht werfen ConcurrentModificationException, sodass die Sammlung nicht gesperrt werden muss während der Iteration.

Wie bei allen Verbesserungen gibt es immer noch ein paar Kompromisse. Die Semantik der Methoden die auf der gesamten Map funktionieren, wie Größe und isEmpty, sind leicht gewesen geschwächt, um die gleichzeitige Natur der Sammlung widerzuspiegeln. Seit dem Ergebnis der Größe könnte veraltet sein, wenn es berechnet wird, es ist wirklich nur eine Schätzung, also Größe darf eine Näherung anstelle einer genauen Zählung zurückgeben. Während zuerst dies mag beunruhigend wirken, in Wirklichkeit sind Methoden wie size und isEmpty weitaus weniger nützlich gleichzeitige Umgebungen, weil diese Mengen bewegliche Ziele sind.



Zweitens, Collections.synchronizedMap

Es ist einfach HashMap mit synchronisierten Methoden - ich würde es als deprected dute zu CHM bezeichnen

    
dantuch 27.09.2012 19:26
quelle
0

könnten Sie wahrscheinlich tun

%Vor%

Ein Leser sieht eine konstante Karte, so dass Lesevorgänge keine Synchronisierung erfordern und nicht blockiert werden.

    
irreputable 27.09.2012 19:32
quelle

Tags und Links