5

Ich brauche eine HashMap, die aus mehreren Threads zugänglich ist.Gibt es irgendwelche Nachteile mit ConcurrentHashMap?

Es gibt zwei einfache Optionen, die eine normale HashMap verwenden und darauf synchronisieren oder eine ConcurrentHashMap verwenden.

Da ConcurrentHashMap bei Lesevorgängen nicht blockiert, scheint es viel besser für meine Bedürfnisse geeignet (fast ausschließlich liest, fast nie aktualisiert). Auf der anderen Seite, erwarte ich sowieso sehr geringe Nebenläufigkeit, also sollte es keine Blockierung geben (nur die Kosten für die Verwaltung der Sperre).

Die Karte wird auch sehr klein sein (unter zehn Einträge), wenn das einen Unterschied macht.

Verglichen mit einer normalen HashMap, wie viel teurer sind die Lese- und Schreiboperationen (ich nehme an, dass sie das sind)? Oder ist ConcurrentHashMap einfach immer besser, wenn es trotz des Lese/Aktualisierungs-Verhältnisses und der Größe sogar einen moderaten Grad an gleichzeitigen Zugriff gibt?

+0

Genaue doppelte Frage? http://stackoverflow.com/questions/1378310/performance-concurrenthashmap-vs-hashmap – andersoj

+0

In der Tat. Vielen Dank.(Allerdings gibt es noch keine befriedigende Antwort) – Thilo

Antwort

6

Auf der anderen Seite, erwarte ich sowieso sehr geringe Nebenläufigkeit, also sollte es keine Blockierung geben (nur die Kosten für die Verwaltung der Sperre).

Die Kosten für den Erwerb und eine uncontend Java Mutex (primitive lock) Lösen ist winzig. Also, wenn Sie glauben, dass die Wahrscheinlichkeit der Konkurrenz sehr niedrig ist, dann ist eine einfache HashMap wahrscheinlich Ihre beste Wette.

Aber das ist alles Vermutung. Solange und bis Sie Ihre Anwendung tatsächlich profiliert haben, ist die gesamte Zeit, die für die spekulative Optimierung aufgewendet wird, höchstwahrscheinlich (*) Zeitverschwendung.

* ... es sei denn, Sie haben eine wirklich gute Intuition.

+0

Stephen C hat recht (sein Ruf deutet darauf hin, dass dies eine Gewohnheit ist). Unbefestigte Sperren sind im allgemeinen Fall schnell ... Ich komme vielleicht zu schnell zu CHM. – andersoj

+0

Wie sieht es mit der Skalierung aus? Was erwartet wird und was passieren könnte, sind völlig anders. Wenn das Sperren/Entsperren so klein ist, benutze einfach "ConcurrentHashMap" und gehe weiter – TheLQ

+1

@TheLQ - es sind die anderen Gemeinkosten (abgesehen von der Sperrung) der Verwendung von ConcurrentHashMap. Sie werfen CCM nicht einfach auf ein Problem in der Annahme, dass Skalierbarkeit * ein Problem sein wird. Du machst zuerst! –

2

CHM zahlt im Vergleich zu HashMap eine gewisse Strafe für die Verwendung von Atomic * -Operationen unter den Deckeln. Wie viel? Rate mal was ... in deiner App messen ... ;-)

Wenn Sie feststellen, dass Sie tatsächlich ein Performance-Problem haben, gibt es wahrscheinlich eine sehr spezialisierte Lösung für < 10 Einträge, die billiger wäre als jede andere Lösung von java.util Land, aber ich würde nicht dazu springen, bis Sie wissen, dass Sie ein Leistungsproblem haben.

+0

Die Frage, die ich habe, ist, ob ich zur Verwendung von ConcurrentHashMap springen sollte, bevor ich weiß, dass ich ein Leistungsproblem habe. Ich würde das nicht tun wollen, wenn CHM im Fall von Parallelität langsamer ist als HashMap. – Thilo

+0

Ich nehme an, ich würde 'CHM' verwenden, wenn sofort ersichtlich ist, dass Sie die gewünschte Nebenläufigkeitssteuerung mit' putIfAbsent() 'und ähnlichem erhalten können; Ich würde 'synchronized (normalHashMap)' verwenden, wenn Sie im Voraus wissen, dass die Operation 'put()' komplex sein wird. (Optimiere entweder später, wenn es ein Problem ist ...) – andersoj

2

In Bezug auf Durchsatz und Leistung ist der Overhead normalerweise vernachlässigbar.

Mit anderen Worten, der Speicherbedarf einer ConcurrentHashMap (auf Instanzebene) ist etwas größer als eine HashMap. Wenn Sie eine große Anzahl von kleinen CHMs haben, könnte sich dieser Overhead addieren.

Verwandte Themen