Hoe kan ik een gelijktijdige hash-kaart het beste implementeren in Java?



Dit artikel zal je kennis laten maken met een concept genaamd Concurrent Hash Map In Java en het opvolgen met een praktische demonstratie

Dit artikel laat je kennismaken met een concept genaamd Concurrent Hash Map In en vervolg het met een praktische demonstratie.Volgende tips zullen in dit artikel worden behandeld,

Verderop met dit artikel over Concurrent Hash Map in Java





Hoe werkt ConcurrentHashMap intern?

Vanaf Java 5 wordt ConcurrentHashMap geïntroduceerd als alternatief voor HashTable. We kunnen ook een gesynchroniseerde kaart krijgen met behulp van de utility class-methode genaamd synchronizedMap (), maar er is een nadeel van deze methode, namelijk zeer slechte prestaties omdat slechts een enkele thread er tegelijkertijd toegang toe heeft. ConcurrentHashMap lost deze problemen dus op.



Verderop met dit artikel over Concurrent Hash Map in Java

Waarom een ​​andere kaart?

Ook al hebben we al HashMap, HashTable, wat is er dan nodig voor ConcurrentHashMap, het is omdat het betere prestaties biedt en tegelijkertijd thread-safe is.

Verderop met dit artikel over Concurrent Hash Map in Java



Hoe is het anders?

Het is ook gebaseerd op hashing, maar de prestaties worden verbeterd door de vergrendelingsstrategie. In tegenstelling tot HashTable of Synchronized HashMap past het niet dezelfde vergrendeling toe op elke methode, het gebruikt een afzonderlijk slot voor elke methode. Het gebruikt voor dit doel een inspringende vergrendeling. Net als bij HashMap heeft ConcurrentHashMap 16 buckets, dat wil zeggen segmenten, om ConcurrentHashMap te maken met meer dan 16 buckets heeft het verschillende constructors.

Voordat we in detail gaan praten, laten we een paar concepten hieronder bekijken:

ConcurrentHashMap: deze map staat gelijktijdige threadtoegang toe. Slechts een deel van de kaart met de naam segment, d.w.z. de onderliggende gegevensstructuur, wordt vergrendeld tijdens het toevoegen of bijwerken van de kaart. Het maakt gelijktijdige threadtoegang mogelijk om de gegevens te lezen zonder vergrendeling. Het is geïntroduceerd om de prestaties te verbeteren.

  • Gelijktijdigheidsniveau: het is een getal dat een geschat aantal threads is die gelijktijdig worden bijgewerkt.
  • Belastingfactor: dit is een waarde die wordt gebruikt om de formaatfactor te regelen.
  • Initiële capaciteit: het is een eigenschap die een kaart maakt met de opgegeven grootte.

Laten we het onderstaande diagram bekijken en proberen te begrijpen hoe ConcurrentHashMap werkt.

Afbeelding - Gelijktijdige Hashmap - Edureka

Dus in het bovenstaande diagram hebben we 16 vergrendelingen die slechts een deel van de kaart vergrendelen dat nodig is, zodat andere methoden toegankelijk zijn voor verschillende threads, waardoor de prestaties worden verbeterd.

Vergelijkbaar met HashMap, werkt ConcurrentHashMap op een vergelijkbare manier, het bevat standaard 16 segmenten en slaat elementen op door middel van hashing, dus als de elementen dezelfde hash hebben, worden ze opgeslagen in hetzelfde segment als in het bovenstaande diagram met behulp van de gekoppelde lijst.

Verderop met dit artikel over Concurrent Hash Map in Java

Verschil tussen ConcurrentHashMap en HashMap

HashMap behoort tot Collecties terwijl ConcurrentHashMap tot Concurrent Collections behoort, maar er zijn veel andere verschillen tussen hen.

  • ConcurrentHashMap isDraadveilig, d.w.z.gesynchroniseerd maar HashMap is niet gesynchroniseerd.
  • ConcurrentHashMap levert weinig prestaties omdat het gesynchroniseerd is omdat threads soms moeten wachten, maar HashMap presteert goed omdat het niet-gesynchroniseerd is en alle threads er tegelijkertijd toegang toe hebben.
  • We krijgen ConcurrentModificationException als twee threads tegelijkertijd proberen de inhoud van Object te wijzigen of toe te voegen. In het geval van ConcurrentHashMap krijgen we echter geen uitzondering tijdens het uitvoeren van dezelfde bewerking.

  • Null-waarden zijn toegestaan ​​voor sleutel en waarden in HashMap, maar ConcurrentHashMap staat geen null-waarden toe voor sleutel en waarde, het probeerde een null-waarde toe te voegen, we krijgen een uitzondering, dat wil zeggen NullPointerException.

  • HashMap wordt geïntroduceerd in JDK 1.2, terwijl ConcurrentHashMap wordt geïntroduceerd in JDK 1.5.

Zoals we eerder hebben gezien voor betere prestaties, bestaat het uit een reeks knooppunten als table buckets die eerder tabelsegmenten waren Java 8 .

De emmers worden lui geïnitialiseerd wanneer de eerste plaatsing wordt uitgevoerd. Elke bucket kan onafhankelijk worden vergrendeld door het eerste knooppunt van de bucket te vergrendelen, ook leesbewerkingen blokkeren niet.

Vergeleken bij HashMap, ConcurrentHashMap zorgt voor de extra concurrencyLevel argument om het geschatte aantal te gebruiken threads te bepalen.

Constructeurs:

  1. ConcurrentHashMap m = nieuwe ConcurrentHashMap ()

    Er wordt een nieuwe lege kaart gemaakt met een standaard initiële capaciteit van 16, een belastingsfactor van 0,75 en gelijktijdigheidsniveau 16.

  2. ConcurrentHashMap m = nieuwe ConcurrentHashMap (int initialCapacity)
    Er wordt een nieuwe lege kaart gemaakt met een gespecificeerde initiële capaciteit, belastingsfactor van 0,75 en gelijktijdigheidsniveau 16.

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

    Er wordt een nieuwe lege kaart gemaakt met een gespecificeerde initiële capaciteit en belastingsfactor met concurrency-niveau 16.

  4. ConcurrentHashMap m = nieuwe ConcurrentHashMap (int initialCapacity, float loadFactor, int concurrencyLevel)
    Er wordt een nieuwe lege kaart gemaakt met een gespecificeerde initiële capaciteit, belastingsfactor en gelijktijdigheidsniveau.

  5. ConcurrentHashMap m = nieuwe ConcurrentHashMap (kaart m)
    Maakt een nieuwe ConcurrentHashMap van de verstrekte kaart.

De andere twee argumenten: initialCapacity en loadFactor werkten ongeveer hetzelfde als HashMap.
ConcurrentMap is geheugenconsistent voor sleutel / waarde-bewerkingen in een omgeving met meerdere threads.

Verderop met dit artikel over Concurrent Hash Map in Java

Valkuilen

Bij het ophalen van objecten wordt ConcurrentHashMap niet geblokkeerd en kan deze overlappen met updatebewerkingen, dus voor betere prestaties halen ze alleen de meest recent voltooide updatebewerkingen op.

Resultaten van geaggregeerde statusmethoden, waaronder size, isEmpty, en containsValue zijn doorgaans alleen nuttig wanneer een kaart geen gelijktijdige updates ondergaat in andere threads.

Als gelijktijdige updates correct worden beheerd, kunnen deze statusmethoden betrouwbaar zijn.

Hoewel deze methoden niet in realtime garanderen.

De standaardcapaciteit van de tabel is 16, maar we kunnen dit wijzigen met het gelijktijdigheidsniveau.

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

Als sleutels moeten worden gesorteerd, kunnen we ConcurrentSkipListMap gebruiken.

Nu, na het uitvoeren van het bovenstaande programma, zou u de Concurrent Hash Map in Java hebben begrepen. Zo zijn we aan het einde gekomen van dit artikel over Als je meer wilt weten, bekijk dan het , een vertrouwd online leerbedrijf. Edureka's Java J2EE- en SOA-trainings- en certificeringscursus is ontworpen om u te trainen in zowel kern- als geavanceerde Java-concepten, samen met verschillende Java-frameworks zoals Hibernate & Spring.

Heeft u een vraag voor ons? Vermeld het in het opmerkingengedeelte van dit artikel en we nemen zo snel mogelijk contact met u op.

wat is een Java-ide