ConcurrentHashMap sperren
Ich habe irgendwo gelesen, dass in ConcurrentHashMap
die ganze map-Objekt nicht gesperrt ist, und stattdessen wird eine Sperre auf einen Teil der Karte.
Kann jemand aufwendigen, wenn nicht sperren ins Spiel kommen?
Ist es richtig, dass beim Lesen der Karte es gibt keine Verriegelung beteiligt sind, aber während der Aktualisierung es nur sperren verwendet wird?
- dieser Artikel sollte helfen: ibm.com/developerworks/java/library/j-jtp08223
- javadoc ist ziemlich detailliert in der Erklärung der Umsetzung.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja,
ConcurrentHashMap
verwendet eine Vielzahl von sperren (standardmäßig 16) jede Sperre steuert ein segment der hash.Beim festlegen von Daten in einem bestimmten segment, das Schloss für dieses segment gewonnen wird.
Beim abrufen von Daten, einen flüchtigen Lesen verwendet wird. Wenn die flüchtigen Lesen Sie die Ergebnisse in einen zu verpassen, dann ist die Sperre des Segments ist, die für einen letzten Versuch erfolgreich gelesen.
Verriegelung ist so gering wie möglich gehalten werden und dennoch thread-sicher sind.
Erklären "Teil der Karte ist gesperrt", dies bedeutet, dass bei einem Update, nur ein "1/concurrencyLevel" von der Karte (basierend auf einem hash-Schlüssel) verriegelt ist. Dies bedeutet, dass zwei updates noch gleichzeitig ausführen, sicher, wenn Sie jeden Einfluss auf separate "buckets", also die Minimierung der lock-Konflikte und damit die Maximierung der Leistung.
Wichtiger ist, das Vertrauen der JDK-Implementierung - Sie sollten sich nicht sorgen zu machen über die Einzelheiten der Implementierung im JDK (für eine Sache, kann es von Version zu Version ändern). Vielmehr konzentrieren Sie sich nur auf das schreiben Ihre code.
ConcurrentHashMap verwenden Reentrant-Lock-Mechanismus. ConcurrentHashMap verwendet Segmente anstelle von Eimern und als neuen Datensatz bekommen, insert lock bekommen erwerben, nur auf segment nicht die vollständige Liste der Segmente. Also hier Idee macht klar, dass multi-level-Sperre bekommen erwerben auf die gleiche.
Da keine Parallelität Ebene wurde festgelegt explictity, die ConcurrentHashMap wird aufgeteilt in 16 Segmente. Und jedes segment agiert als ein unabhängiges HashMap.
Gibt es keine sperren angewendet auf read-operation in ConcurrentHashMap.