Concurrenthashmap (kurz CHM) wurde in Java 1.5 als Alternative zu Hashtable neu eingeführt und ist ein wichtiges Mitglied des gleichzeitigen Pakets. Wenn Sie vor Java 1.5 eine Karte implementieren möchten, die sicher in Multi-Threaded-und gleichzeitigen Programmen verwendet werden kann, können Sie nur aus Hashtable- und Synchronisierungskarte wählen, da HashMap nicht mit Thread-safe ist. Aber nachdem wir CHM eingeführt haben, haben wir eine bessere Wahl. CHM ist nicht nur mit Thread-Safe, sondern funktioniert auch besser als Hashtable und SynchronizedMap. Im Vergleich zu Hashtable und SynchronizedMap ist die gesamte Karte gesperrt, und CHM sperrt nur einige Karten. CHM ermöglicht gleichzeitige Lesevorgänge gleichzeitig die Datenintegrität während des Schreibvorgangs durch synchrone Sperren. Wir haben die Grundlagen von CHM in den Top 5 Java -gleichzeitigen Sammlungen von JDK 5 und 6 gelernt. In diesem Blog werde ich die folgenden Punkte einführen:
Implementierung von Concurrenthashmap in Java
CHM führt eine Segmentierung ein und bietet alle von Hashtable unterstützten Funktionen. In CHM wird Multithreading beim Lesen der Karte unterstützt und erfordert keine Blockierung. Dies liegt an der Tatsache, dass CHM die Karte in verschiedene Teile aufteilt und nur einen Teil davon sperrt, wenn der Aktualisierungsvorgang durchgeführt wird. Gemäß der standardmäßigen Parallelitätsstufe ist die Karte in 16 Teile unterteilt und durch verschiedene Schlösser gesteuert. Dies bedeutet, dass bis zu 16 Schreibbevölkerung die Karte gleichzeitig bedienen können. Stellen Sie sich vor, von nur einem Thread, der bis zu 16 Threads, die gleichzeitig eintreten, eingeben (Lesefäden sind nahezu unbegrenzt), ist die Leistungsverbesserung offensichtlich. Da jedoch einige Aktualisierungsvorgänge wie Put (), remove (), putall () und clear () den Vorgang nur sperren, kann der Suchvorgang nicht garantieren, dass die neuesten Ergebnisse zurückgegeben werden.
Ein weiterer wichtiger Punkt ist, dass der von Keyset zurückgegebene Iterator beim Iterieren über CHM schwach konsistent ist und versagt ist und möglicherweise einige jüngste Änderungen zurückgibt. Während des Traversals wird die Ausnahme von ConcurrentModificificificificationexceptoin nicht ausgelöst, wenn der Inhalt des Arrays, der sich durchquert hat, nicht ausgelöst wird.
Die standardmäßige Parallelitätsniveau von CHM beträgt 16, kann jedoch durch einen Konstruktor beim Erstellen von CHM geändert werden. Es besteht kein Zweifel, dass die Parallelitätsstufe die Anzahl der gleichzeitigen Aktualisierungsvorgänge darstellt. Wenn also nur wenige Threads die Karte aktualisieren, wird empfohlen, eine niedrige Parallelitätsniveau festzulegen. Darüber hinaus nutzt CHM Reentrantlock auch, um Segmente zu sperren.
Beispiel für die Putifababent -Methode der Concurrenthashmap in Java
Oft möchten wir Elemente einfügen, wenn sie nicht existieren, und wir schreiben normalerweise Code wie folgt
synchronisiert (map) {if (map.get (key) == null) {return map.put (Schlüssel, Wert); } else {return map.get (Schlüssel); }}Der obige Code ist in HashMap und Hashtable einfach zu verwenden, aber es besteht das Risiko von Fehlern in CHM. Dies liegt daran, dass CHM die gesamte Karte während des Einsatzbetriebs nicht sperrt. Wenn also ein Thread (k, v) gefügt wird, erhalten Sie ein weiterer Thread -Aufruf (k) und null, was den Wert eines Fadens durch den Wert eines anderen Puts überschrieben wird. Natürlich können Sie den Code in einen synchronisierten Codeblock integrieren, wodurch Ihr Code einzelner Thread, wenn auch thread-sicher ist. Die von CHM bereitgestellte PutifabSent -Methode (Schlüssel, Wert-) Methode implementiert die gleiche Funktion atomisch und vermeidet das Risiko einer obigen Thread -Konkurrenz.
Wann zu verwenden, um Concurrenthashmap zu verwenden
CHM ist geeignet, wenn die Anzahl der Leser die Anzahl der Leser überschreitet. Wenn die Anzahl der Leser größer oder gleich dem Leser ist, ist die Leistung von CHM niedriger als die von Hashtable und synchronisierten Karte. Dies liegt daran, dass bei der Sperrung der gesamten Karte der Lesevorgang auf den Thread wartet, der die Schreiboperation zum enden gleichen Teil ausführt. CHM eignet sich zum Erstellen von Cache, zu Beginn des Programms initialisiert und kann dann mit mehreren anfordernden Threads zugegriffen werden. Wie Javadoc erklärt, ist CHM eine gute Alternative zu Hashtable, aber denken Sie daran, dass CHM etwas weniger Synchronisation als Hashtable hat.
Zusammenfassen
Jetzt wissen wir, was die Concurrenthashmap ist und wann sie Concurrenthashmap verwenden müssen. Lassen Sie uns einige wichtige Punkte von CHM überprüfen.
Die oben genannten sind die Implementierungs- und Nutzungsszenarien von CHM in Java. Ich hoffe, es kann allen helfen! Vielen Dank für Ihre Unterstützung für diese Website!