Hur man bäst implementerar samtidiga hashkartor i Java?



Den här artikeln introducerar dig till ett koncept som kallas Concurrent Hash Map i Java och följer upp det med en praktisk demonstration

Den här artikeln presenterar dig för ett koncept som kallas Concurrent Hash Map In och följ upp den med en praktisk demonstration. Följande tips kommer att beskrivas i den här artikeln,

Fortsätter med den här artikeln på Concurrent Hash Map i Java





Hur fungerar ConcurrentHashMap internt?

Från och med Java 5 introduceras ConcurrentHashMap som ett alternativ för HashTable. Vi kan också få en synkroniserad karta med hjälp av verktygsklassmetoden som heter synchronizedMap () men det finns en nackdel med den här metoden, dvs. mycket dålig prestanda eftersom endast en enda tråd kan komma åt den samtidigt. Så löser ConcurrentHashMap dessa problem.



Fortsätter med den här artikeln på Concurrent Hash Map i Java

Varför annan karta?

Även om vi redan har HashMap, HashTable, vad är ett behov av ConcurrentHashMap, det beror på att det ger bättre prestanda samtidigt som det är trådsäkert.

Fortsätter med den här artikeln på Concurrent Hash Map i Java



Hur är det annorlunda?

Den är också baserad på hashing men dess prestanda förbättras av dess låsningsstrategi. Till skillnad från HashTable eller Synchronized HashMap tillämpar den inte samma lås på varje metod, det använder ett separat lås för varje metod, det använder återinträdeslås för detta ändamål. I likhet med HashMap har ConcurrentHashMap 16 skopor, dvs segment, för att skapa ConcurrentHashMap med mer än 16 skopor har det olika konstruktörer.

Innan vi pratar i detalj, låt oss granska några begrepp nedan:

ConcurrentHashMap: Denna karta ger åtkomst till tråd samtidigt. Endast en del av kartan som kallas segment, dvs. underliggande datastruktur, låses när kartan läggs till eller uppdateras. Det möjliggör samtidig trådåtkomst för att läsa data utan att låsa. Den introducerades för att förbättra prestanda.

  • Concurrency-Level: Det är ett tal som är ett beräknat antal trådar som uppdateras samtidigt.
  • Load-Factor: Det är ett värde som används för att kontrollera storleksfaktorn.
  • Initial kapacitet: Det är en egenskap som skapar en karta med den angivna storleken.

Låt oss se nedanstående diagram och försöka förstå hur ConcurrentHashMap fungerar.

Bild- Samtidig Hashmap- Edureka

Så i ovanstående diagram har vi 16 lås som endast låser en del av kartan som krävs så att andra metoder kan nås av olika trådar vilket förbättrar prestanda.

På samma sätt som HashMap fungerar ConcurrentHashMap på ett liknande sätt som innehåller 16 segment som standard och lagrar element genom hashing, så om elementen har samma hash lagras de i samma segment som visas i diagrammet ovan med hjälp av den länkade listan.

hur man skapar en jframe

Fortsätter med den här artikeln på Concurrent Hash Map i Java

Skillnad mellan ConcurrentHashMap och HashMap

HashMap tillhör samlingar medan ConcurrentHashMap tillhör samtidiga samlingar men det finns många andra skillnader mellan dem.

  • ConcurrentHashMap ärTrådsäker dvssynkroniserad men HashMap är icke-synkroniserad.
  • ConcurrentHashMap har låg prestanda eftersom den är synkroniserad eftersom trådar ibland måste vänta men HashMap har hög prestanda eftersom den inte är synkroniserad och alla trådar kan komma åt den samtidigt.
  • Vi får ConcurrentModificationException om två trådar samtidigt försöker ändra eller lägga till innehåll i objektet. I fallet med ConcurrentHashMap får vi dock inget undantag när vi utför samma operation.

  • Nollvärden är tillåtna för nyckel och värden i HashMap, men ConcurrentHashMap tillåter inte nollvärden för nyckel och värde det försökte lägga till nollvärde, vi får undantag, dvs NullPointerException.

  • HashMap introduceras i JDK 1.2 medan ConcurrentHashMap introduceras i JDK 1.5.

Som vi har sett tidigare för bättre prestanda består den av en rad noder som bordshinkar som var bordssegment före Java 8 .

Skoporna initialiseras lat när den första insättningen utförs. Varje hink kan låsas oberoende av varandra genom att låsa den första noden på skopan.

c ++ sortera int-array

Jämfört med HashMap, ConcurrentHashMap ger extra concurrencyLevel argument för att styra antalet uppskattade trådar som ska användas.

Konstruktörer:

  1. ConcurrentHashMap m = ny ConcurrentHashMap ()

    En ny tom karta skapas med en initial startkapacitet på 16, belastningsfaktor på 0,75 och samtidighetsnivå 16.

  2. ConcurrentHashMap m = ny ConcurrentHashMap (int initialCapacity)
    En ny tom karta skapas med en specificerad initialkapacitet, belastningsfaktor på 0,75 och samtidighetsnivå 16.

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

    En ny tom karta skapas med en specificerad initial kapacitet och belastningsfaktor med samtidighetsnivå 16.

  4. ConcurrentHashMap m = ny ConcurrentHashMap (int initialCapacity, float loadFactor, int concurrencyLevel)
    En ny tom karta skapas med en angiven initial kapacitet, belastningsfaktor och samtidighetsnivå.

  5. ConcurrentHashMap m = ny ConcurrentHashMap (karta m)
    Skapar ny ConcurrentHashMap från den medföljande kartan.

De andra två argumenten: initialCapacity och loadFactor fungerade på samma sätt som HashMap.
ConcurrentMap är minne som överensstämmer med nyckel / värde-operationer i en miljö med flera trådar.

Fortsätter med den här artikeln på Concurrent Hash Map i Java

Fallgropar

Medan hämtning av objekt är ConcurrentHashMap inte blockerad och kan överlappa med uppdateringsåtgärder, så för bättre prestanda hämtar de bara senast slutförda uppdateringsåtgärder.

Resultat av aggregerade statusmetoder inklusive storlek, är tomt och innehåller värde är vanligtvis bara användbara när en karta inte genomgår samtidiga uppdateringar i andra trådar.

Om samtidiga uppdateringar kontrolleras ordentligt kan dessa statusmetoder vara tillförlitliga.

Även om dessa metoder inte garanterar i realtid.

Standardtabellkapaciteten är 16, men vi kan ändra den med samtidighetsnivå.

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

Om nyckelnycklar krävs i sorterad ordning kan vi använda ConcurrentSkipListMap.

Efter att ha kört ovanstående program skulle du ha förstått Concurrent Hash Map i Java. Således har vi kommit till slutet av den här artikeln om du vill veta mer, kolla in , ett pålitligt online-lärande företag. Edurekas Java J2EE- och SOA-utbildning och certifieringskurs är utformad för att träna dig för både grundläggande och avancerade Java-koncept tillsammans med olika Java-ramverk som Hibernate & Spring.

Har du en fråga till oss? Vänligen nämna det i kommentarsektionen i den här artikeln så kommer vi tillbaka till dig så snart som möjligt.