Hvordan bedst implementeres samtidige Hash-kort i Java?



Denne artikel introducerer dig til et koncept kaldet Concurrent Hash Map i Java og følger det op med en praktisk demonstration

Denne artikel introducerer dig til et koncept kaldet Concurrent Hash Map In og følg den op med en praktisk demonstration. Følgende henvisninger vil blive dækket i denne artikel,

Fortsætter med denne artikel om Concurrent Hash Map i Java





Hvordan fungerer ConcurrentHashMap internt?

Fra Java 5 og frem introduceres ConcurrentHashMap som et alternativ til HashTable. Vi kan også få et synkroniseret kort ved hjælp af værktøjsklassemetoden kaldet synchronizedMap (), men der er en ulempe ved denne metode, dvs. meget dårlig ydeevne, da kun en enkelt tråd kan få adgang til den ad gangen. Så ConcurrentHashMap løser disse problemer.



Fortsætter med denne artikel om Concurrent Hash Map i Java

Hvorfor andre kort?

Selvom vi allerede har HashMap, HashTable, hvad er der et behov for ConcurrentHashMap, det er fordi det giver bedre ydeevne, samtidig med at det er trådsikkert.

c ++ Fibonacci-serie

Fortsætter med denne artikel om Concurrent Hash Map i Java



Hvordan er det anderledes?

Det er også baseret på hashing, men dets ydeevne forbedres af dets låsestrategi. I modsætning til HashTable eller Synkroniseret HashMap anvender den ikke den samme lås på hver metode, den bruger en separat lås til hver metode, den bruger genindføringslås til dette formål. I lighed med HashMap har ConcurrentHashMap 16 skovle, dvs. segmenter, for at skabe ConcurrentHashMap med mere end 16 skovle har den forskellige konstruktører.

Før vi taler i detaljer, lad os gennemgå et par begreber nedenfor:

ConcurrentHashMap: Dette kort giver samtidig trådadgang. Kun en del af kortet kaldet segment, dvs. den underliggende datastruktur, bliver låst, mens kortet tilføjes eller opdateres. Det giver samtidig trådadgang til at læse dataene uden at låse. Det blev introduceret for at forbedre ydeevnen.

  • Concurrency-Level: Det er et tal, der er et estimeret antal samtidige opdaterende tråde.
  • Load-Factor: Det er en værdi, der bruges til at kontrollere størrelsesfaktoren.
  • Indledende kapacitet: Det er en egenskab, der opretter et kort med den angivne størrelse.

Lad os se nedenstående diagram og prøve at forstå, hvordan ConcurrentHashMap fungerer.

Billed- Samtidig Hashmap- Edureka

Så i ovenstående diagram har vi 16 låse, der kun låser en del af kortet, som er påkrævet, så andre metoder kan tilgås med forskellige tråde og dermed forbedrer ydeevnen.

I lighed med HashMap fungerer ConcurrentHashMap på en lignende måde, det indeholder 16 segmenter som standard og gemmer element ved hashing, så hvis elementerne har den samme hash, gemmes de i det samme segment som vist i diagrammet ovenfor ved hjælp af den linkede liste.

Fortsætter med denne artikel om Concurrent Hash Map i Java

Forskel mellem ConcurrentHashMap og HashMap

HashMap tilhører samlinger, mens ConcurrentHashMap tilhører Concurrent Collections, men der er mange andre forskelle mellem dem.

  • ConcurrentHashMap erTrådsikker dvs.synkroniseret, men HashMap er ikke-synkroniseret.
  • ConcurrentHashMap har lav ydeevne, fordi den er synkroniseret, fordi tråde undertiden skal vente, men HashMap har høj ydeevne, fordi den ikke er synkroniseret, og alle tråde kan få adgang til den samtidigt.
  • Vi får ConcurrentModificationException, hvis to tråde samtidigt forsøger at ændre eller tilføje indhold af objekt. I tilfælde af ConcurrentHashMap får vi dog ingen undtagelse, mens vi udfører den samme operation.

  • Nullværdier er tilladt for nøgle og værdier i HashMap, men ConcurrentHashMap tillader ikke nulværdier for nøgle og værdi, det forsøgte at tilføje nulværdi, vi får undtagelse, dvs. NullPointerException.

  • HashMap introduceres i JDK 1.2, mens ConcurrentHashMap introduceres i JDK 1.5.

Som vi har set tidligere for bedre ydeevne, består den af ​​en række noder som bordspande, der var bordsegmenter før Java 8 .

Skovlene initialiseres dovent, når den første indsættelse udføres. Hver skovl kan låses uafhængigt af hinanden ved at låse skovlens første knudepunkt, og læs ikke operationer blokerer ikke.

Sammenlignet med HashMap, ConcurrentHashMap giver ekstra concurrencyNiveau argument for at kontrollere antallet af estimerede tråde, der skal bruges.

Konstruktører:

  1. ConcurrentHashMap m = ny ConcurrentHashMap ()

    Et nyt tomt kort oprettes med en standard startkapacitet på 16, belastningsfaktor på 0,75 og samtidighedsniveau 16.

  2. ConcurrentHashMap m = ny ConcurrentHashMap (int initialCapacity)
    Et nyt tomt kort oprettes med en specificeret startkapacitet, belastningsfaktor på 0,75 og samtidighedsniveau 16.

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

    Et nyt tomt kort oprettes med en specificeret startkapacitet og belastningsfaktor med samtidighedsniveau 16.

  4. ConcurrentHashMap m = ny ConcurrentHashMap (int initialCapacity, float loadFactor, int concurrencyLevel)
    Et nyt tomt kort oprettes med en specificeret startkapacitet, belastningsfaktor og samtidighedsniveau.

  5. ConcurrentHashMap m = ny ConcurrentHashMap (kort m)
    Opretter nyt ConcurrentHashMap fra det medfølgende kort.

De to andre argumenter: initialCapacity og loadFactor fungerede stort set det samme som HashMap.
ConcurrentMap er hukommelse, der er konsistent på nøgle- / værdifunktioner i et miljø med flere tråde.

Fortsætter med denne artikel om Concurrent Hash Map i Java

Faldgruber

Mens du henter objekter, er ConcurrentHashMap ikke blokeret og kan overlappe med opdateringsoperationer, og for bedre ydelse henter de kun de senest afsluttede opdateringshandlinger.

Resultater af aggregerede statusmetoder inklusive størrelse, isEmpty og containValue er typisk kun nyttige, når et kort ikke gennemgår samtidige opdateringer i andre tråde.

Hvis samtidige opdateringer kontrolleres korrekt, kan disse statusmetoder være pålidelige.

Selvom disse metoder ikke garanterer i realtid.

Standardtabellens kapacitet er 16, men vi kan ændre det ved hjælp af samtidighedsniveau.

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

Hvis det kræves, at tasterne er i sorteret rækkefølge, kan vi bruge ConcurrentSkipListMap.

Efter at have udført ovenstående program ville du have forstået Concurrent Hash Map i Java. Således er vi nået til slutningen af ​​denne artikel om Hvis du ønsker at lære mere, skal du tjekke , et betroet online læringsfirma. Edurekas Java J2EE- og SOA-uddannelses- og certificeringskursus er designet til at træne dig til både kerne- og avancerede Java-koncepter sammen med forskellige Java-rammer som Hibernate & Spring.

Har du et spørgsmål til os? Nævn det i kommentarfeltet i denne artikel, og vi vender tilbage til dig hurtigst muligt.