Wie implementiere ich Concurrent Hash Map am besten in Java?



Dieser Artikel führt Sie in ein Konzept ein, das als Concurrent Hash Map in Java bezeichnet wird, und führt anschließend eine praktische Demonstration durch

Dieser Artikel führt Sie in ein Konzept ein, das als Concurrent Hash Map In bezeichnet wird und folgen Sie mit einer praktischen Demonstration. Folgende Hinweise werden in diesem Artikel behandelt:

Fahren Sie mit diesem Artikel über Concurrent Hash Map in Java fort





Wie funktioniert ConcurrentHashMap intern?

Ab Java 5 wird ConcurrentHashMap als Alternative für HashTable eingeführt. Wir können eine synchronisierte Map auch mit der Utility-Klassenmethode synchronizedMap () abrufen, aber diese Methode hat einen Nachteil, d. H. Eine sehr schlechte Leistung, da nur ein einzelner Thread gleichzeitig darauf zugreifen kann. ConcurrentHashMap behebt diese Probleme.



Fahren Sie mit diesem Artikel über Concurrent Hash Map in Java fort

Warum andere Karte?

Obwohl wir bereits HashMap, HashTable, haben, was ConcurrentHashMap benötigt, liegt es daran, dass es eine bessere Leistung bietet und gleichzeitig threadsicher ist.

SQL Server Tutorial für Anfänger mit Beispielen

Fahren Sie mit diesem Artikel über Concurrent Hash Map in Java fort



Wie ist es anders?

Es basiert ebenfalls auf Hashing, aber seine Leistung wird durch seine Sperrstrategie verbessert. Im Gegensatz zu HashTable oder Synchronized HashMap wird nicht für jede Methode dieselbe Sperre angewendet. Für jede Methode wird eine separate Sperre verwendet. Zu diesem Zweck wird die Wiedereintrittssperre verwendet. Ähnlich wie HashMap verfügt ConcurrentHashMap über 16 Buckets, d. H. Segmente. Um ConcurrentHashMap mit mehr als 16 Buckets zu erstellen, verfügt es über verschiedene Konstruktoren.

Bevor wir im Detail sprechen, lassen Sie uns einige Konzepte unten überprüfen:

ConcurrentHashMap: Diese Zuordnung ermöglicht den gleichzeitigen Zugriff auf Threads. Nur ein Teil der Karte, der als Segment bezeichnet wird, d. H. Die zugrunde liegende Datenstruktur, wird beim Hinzufügen oder Aktualisieren der Karte gesperrt. Es ermöglicht den gleichzeitigen Thread-Zugriff, um die Daten ohne Sperren zu lesen. Es wurde eingeführt, um die Leistung zu verbessern.

  • Parallelitätsstufe: Dies ist eine Zahl, bei der es sich um eine geschätzte Anzahl von gleichzeitig aktualisierten Threads handelt.
  • Lastfaktor: Dies ist ein Wert, der zur Steuerung des Größenänderungsfaktors verwendet wird.
  • Anfangskapazität: Dies ist eine Eigenschaft, die eine Karte mit der angegebenen Größe erstellt.

Sehen wir uns das folgende Diagramm an und versuchen zu verstehen, wie ConcurrentHashMap funktioniert.

Bild-gleichzeitige Hashmap-Edureka

Im obigen Diagramm haben wir also 16 Sperren, die nur einen Teil der Karte sperren, der erforderlich ist, damit andere Threads auf andere Methoden zugreifen können, wodurch die Leistung verbessert wird.

Ähnlich wie HashMap funktioniert ConcurrentHashMap auf ähnliche Weise. Es enthält standardmäßig 16 Segmente und speichert Elemente durch Hashing. Wenn die Elemente denselben Hash haben, werden sie mithilfe der verknüpften Liste in demselben Segment gespeichert, wie im obigen Diagramm gezeigt.

Fahren Sie mit diesem Artikel über Concurrent Hash Map in Java fort

Unterschied zwischen ConcurrentHashMap und HashMap

HashMap gehört zu Sammlungen, während ConcurrentHashMap zu gleichzeitigen Sammlungen gehört, es gibt jedoch viele andere Unterschiede zwischen ihnen.

  • ConcurrentHashMap istGewindesicher, d.h.synchronisiert, aber HashMap ist nicht synchronisiert.
  • ConcurrentHashMap hat eine geringe Leistung, weil es synchronisiert ist, weil manchmal Threads warten müssen, aber HashMap hat eine hohe Leistung, weil es nicht synchronisiert ist und alle Threads gleichzeitig darauf zugreifen können.
  • ConcurrentModificationException wird angezeigt, wenn zwei Threads gleichzeitig versuchen, den Inhalt von Object zu ändern oder hinzuzufügen. Im Fall von ConcurrentHashMap erhalten wir jedoch keine Ausnahme, wenn wir denselben Vorgang ausführen.

  • Nullwerte sind für Schlüssel und Werte in HashMap zulässig. ConcurrentHashMap erlaubt jedoch keine Nullwerte für Schlüssel und Wert, bei denen versucht wurde, einen Nullwert hinzuzufügen. Wir erhalten eine Ausnahme, d. H. Eine NullPointerException.

  • HashMap wird in JDK 1.2 eingeführt, während ConcurrentHashMap in JDK 1.5 eingeführt wird.

Wie wir zuvor für eine bessere Leistung gesehen haben, besteht es aus einem Array von Knoten als Tabellen-Buckets, die zuvor Tabellensegmente waren Java 8 .

Teilzeichenfolge in SQL Server mit Beispiel

Die Buckets werden beim ersten Einfügen träge initialisiert. Jeder Bucket kann unabhängig gesperrt werden, indem der erste Knoten des Buckets gesperrt wird. Auch Lesevorgänge werden nicht blockiert.

Verglichen mit HashMap, ConcurrentHashMap bietet das extra concurrencyLevel Argument zur Steuerung der Anzahl der geschätzten zu verwendenden Threads.

Konstruktoren:

  1. ConcurrentHashMap m = neue ConcurrentHashMap ()

    Eine neue leere Karte wird mit einer anfänglichen Standardkapazität von 16, einem Auslastungsfaktor von 0,75 und einer Parallelitätsstufe von 16 erstellt.

  2. ConcurrentHashMap m = neue ConcurrentHashMap (int initialCapacity)
    Eine neue leere Karte wird mit einer angegebenen Anfangskapazität, einem Auslastungsfaktor von 0,75 und einer Parallelitätsstufe 16 erstellt.

  3. ConcurrentHashMap m = neue ConcurrentHashMap (int initialCapacity, float loadFactor)

    Eine neue leere Karte wird mit einer angegebenen Anfangskapazität und einem angegebenen Auslastungsfaktor mit Parallelitätsstufe 16 erstellt.

  4. ConcurrentHashMap m = neue ConcurrentHashMap (int initialCapacity, float loadFactor, int concurrencyLevel)
    Eine neue leere Karte wird mit einer angegebenen Anfangskapazität, einem angegebenen Auslastungsfaktor und einer festgelegten Parallelitätsstufe erstellt.

  5. ConcurrentHashMap m = neue ConcurrentHashMap (Map m)
    Erstellt eine neue ConcurrentHashMap aus der bereitgestellten Karte.

Die beiden anderen Argumente: initialCapacity und loadFactor funktionierten genauso wie HashMap.
ConcurrentMap ist speicherkonsistent für Schlüssel- / Wertoperationen in einer Multithread-Umgebung.

Fahren Sie mit diesem Artikel über Concurrent Hash Map in Java fort

Was ist Deadlock in Java

Tücken

Beim Abrufen von Objekten wird ConcurrentHashMap nicht blockiert und kann sich mit Aktualisierungsvorgängen überschneiden. Für eine bessere Leistung werden daher nur die zuletzt abgeschlossenen Aktualisierungsvorgänge abgerufen.

Ergebnisse von Aggregatstatusmethoden, einschließlich size, isEmpty und includesValue, sind normalerweise nur dann nützlich, wenn eine Karte in anderen Threads nicht gleichzeitig aktualisiert wird.

Wenn gleichzeitige Aktualisierungen ordnungsgemäß gesteuert werden, können diese Statusmethoden zuverlässig sein.

Diese Methoden garantieren zwar nicht in Echtzeit.

Die Standardtabellenkapazität beträgt 16, wir können sie jedoch mithilfe der Parallelitätsstufe ändern.

public ConcurrentHashMap (int initialCapacity, float loadFactor, int concurrencyLevel) {// ... if (initialCapacity

Wenn Schlüsselschlüssel in sortierter Reihenfolge benötigt werden, können wir ConcurrentSkipListMap verwenden.

Nachdem Sie das obige Programm ausgeführt haben, hätten Sie die Concurrent Hash Map in Java verstanden. Damit sind wir am Ende dieses Artikels angelangt. Wenn Sie mehr erfahren möchten, lesen Sie die , ein vertrauenswürdiges Online-Lernunternehmen. Der Java J2EE- und SOA-Schulungs- und Zertifizierungskurs von Edureka wurde entwickelt, um Sie sowohl für Kern- als auch für fortgeschrittene Java-Konzepte sowie für verschiedene Java-Frameworks wie Hibernate & Spring zu schulen.

Hast du eine Frage an uns? Bitte erwähnen Sie es im Kommentarbereich dieses Artikels und wir werden uns so schnell wie möglich bei Ihnen melden.