Ako najlepšie implementovať súbežnú hashovú mapu v Jave?



Tento článok vám predstaví koncept s názvom Concurrent Hash Map In Java a na ňu nadväzuje praktickou ukážkou

V tomto článku vám predstavíme koncept, ktorý sa nazýva Concurrent Hash Map In a nadviazať na to praktickou ukážkou. Nasledujúcim ukazovateľom sa budeme venovať tento článok,

Pokračujeme týmto článkom o súbežnej hašovacej mape v Jave





Ako funguje ConcurrentHashMap interne?

Od verzie Java 5 sa ako alternatíva pre HashTable predstavuje ConcurrentHashMap. Môžeme tiež získať synchronizovanú mapu pomocou metódy triedy nástrojov nazvanej synchronizedMap (), ale táto metóda má nevýhodu, tj veľmi slabý výkon, pretože k nej môže naraz pristupovať iba jedno vlákno. ConcurrentHashMap teda rieši tieto problémy.



Pokračujeme týmto článkom o súbežnej hašovacej mape v Jave

print_r ()

Prečo iná mapa?

Aj keď už máme HashMap, HashTable, potom čo je potrebné pre ConcurrentHashMap, je to preto, lebo poskytuje lepší výkon a zároveň je bezpečný pre vlákna.

Pokračujeme týmto článkom o súbežnej hašovacej mape v Jave



V čom je to iné?

Je tiež založený na hašovaní, ale jeho výkon zlepšuje stratégia blokovania. Na rozdiel od HashTable alebo Synchronized HashMap neaplikuje rovnaký zámok na každú metódu, používa samostatný zámok pre každú metódu. Na tento účel používa opätovný vstup. Podobne ako HashMap, ConcurrentHashMap má 16 segmentov, tj segmentov, aby vytvoril ConcurrentHashMap s viac ako 16 segmentmi, má rôznych konštruktorov.

Pred podrobným rozhovorom si prečítajme niekoľko koncepcií uvedených nižšie:

ConcurrentHashMap: Táto mapa umožňuje súbežný prístup vlákien. Počas pridávania alebo aktualizácie mapy sa uzamkne iba časť mapy nazývaná segment, tj. Základná dátová štruktúra. Umožňuje súbežný prístup vlákien na čítanie údajov bez blokovania. Bol predstavený na zlepšenie výkonu.

  • Úroveň súbežnosti: Je to číslo, ktoré je odhadovaným počtom súčasne aktualizovaných vlákien.
  • Faktor zaťaženia: Je to hodnota, ktorá sa používa na riadenie faktora zmeny veľkosti.
  • Počiatočná kapacita: Je to vlastnosť, ktorá vytvorí mapu s uvedenou veľkosťou.

Pozrime sa na nižšie uvedený diagram a pokúsime sa pochopiť, ako ConcurrentHashMap funguje.

Obrázok - súbežná hashmapa - Edureka

Takže vo vyššie uvedenom diagrame máme 16 zámkov, ktoré uzamykajú iba časť mapy, ktorá je potrebná, aby bolo možné k iným metódam pristupovať pomocou rôznych vlákien, čím sa zlepší výkon.

Podobne ako HashMap, aj ConcurrentHashMap funguje podobným spôsobom, štandardne obsahuje 16 segmentov a element ukladá pomocou hašovania, takže ak majú prvky rovnaký hash, sú pomocou prepojeného zoznamu uložené v rovnakom segmente, ako je znázornené na obrázku vyššie.

Pokračujeme týmto článkom o súbežnej hašovacej mape v Jave

Rozdiel medzi ConcurrentHashMap a HashMap

HashMap patrí do zbierok, zatiaľ čo ConcurrentHashMap patrí do súbežných zbierok, existuje však medzi nimi veľa ďalších rozdielov.

  • ConcurrentHashMap jeBezpečné pre závit, t.j.synchronizované, ale HashMap nie je synchronizovaný.
  • ConcurrentHashMap má nízky výkon, pretože je synchronizovaný, pretože niekedy musia vlákna čakať, ale HashMap má vysoký výkon, pretože nie je synchronizovaný a akékoľvek vlákna k nemu môžu pristupovať súčasne.
  • ConcurrentModificationException dostaneme, ak sa dve vlákna súčasne pokúšajú upraviť alebo pridať obsah Object. V prípade ConcurrentHashMap však pri vykonávaní tej istej operácie nezískame žiadnu výnimku.

  • Pre kľúč a hodnoty v HashMap sú povolené nulové hodnoty, ConcurrentHashMap však nepovoľuje nulové hodnoty pre kľúč a hodnotu, ktorá sa pokúsila pridať nulovú hodnotu, dostaneme výnimku, tj. NullPointerException.

  • HashMap je predstavený v JDK 1.2, zatiaľ čo ConcurrentHashMap je predstavený v JDK 1.5.

Ako sme už videli pre lepší výkon, pozostáva z radu uzlov ako segmentov tabuľky, ktoré boli predtým segmentmi tabuľky Java 8 .

Vedierka sa lenivo inicializujú pri prvom vložení. Každý segment je možné uzamknúť nezávisle uzamknutím prvého uzla segmentu. Čítanie tiež neblokuje.

V porovnaní s HashMap, ConcurrentHashMap poskytuje navyše concurrencyLevel argument na kontrolu počtu odhadovaných vlákien, ktoré sa majú použiť.

Konštruktéri:

  1. ConcurrentHashMap m = nový ConcurrentHashMap ()

    triediť int pole c ++

    Vytvorí sa nová prázdna mapa s predvolenou počiatočnou kapacitou 16, koeficientom zaťaženia 0,75 a úrovňou súbežnosti 16.

  2. ConcurrentHashMap m = nový ConcurrentHashMap (int initialCapacity)
    Vytvorí sa nová prázdna mapa so zadanou počiatočnou kapacitou, koeficientom zaťaženia 0,75 a úrovňou súbežnosti 16.

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

    Vytvorí sa nová prázdna mapa so zadanou počiatočnou kapacitou a faktorom zaťaženia s úrovňou súbežnosti 16.

  4. ConcurrentHashMap m = nový ConcurrentHashMap (int initialCapacity, float loadFactor, int concurrencyLevel)
    Vytvorí sa nová prázdna mapa so zadanou počiatočnou kapacitou, faktorom zaťaženia a úrovňou súbežnosti.

  5. ConcurrentHashMap m = nový ConcurrentHashMap (mapa m)
    Vytvorí novú ConcurrentHashMap z poskytnutej mapy.

Ďalšie dva argumenty: initialCapacity a loadFactor fungovali úplne rovnako ako HashMap.
ConcurrentMap je pamäť konzistentná pri operáciách kľúč / hodnota v prostredí s viacerými vláknami.

Pokračujeme týmto článkom o súbežnej hašovacej mape v Jave

Úskalia

Zatiaľ čo načítanie objektov ConcurrentHashMap nie je blokované a môže sa prekrývať s operáciami aktualizácie, kvôli lepšiemu výkonu teda načítajú iba naposledy dokončené operácie aktualizácie.

Výsledky metód súhrnného stavu vrátane veľkosti, isEmpty a containsValue sú zvyčajne užitočné iba v prípade, že mapa nepodlieha súbežným aktualizáciám v iných vláknach.

Ak sú súbežné aktualizácie riadené správne, tieto metódy stavu môžu byť spoľahlivé.

Aj keď tieto metódy nezaručujú v reálnom čase.

Predvolená kapacita tabuľky je 16, môžeme ju však zmeniť pomocou úrovne súbežnosti.

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

Ak sa vyžaduje, aby boli kľúče v zoradenom poradí, môžeme použiť ConcurrentSkipListMap.

čo je java ide

Teraz po vykonaní vyššie uvedeného programu by ste pochopili Concurrent Hash Map v Jave. Tak sme sa dostali na koniec tohto článku o Ak sa chcete dozvedieť viac, prečítajte si , dôveryhodná online vzdelávacia spoločnosť. Výcvikový a certifikačný kurz Edureka Java J2EE a SOA je navrhnutý tak, aby vás vyškolil na základné aj pokročilé koncepty Java spolu s rôznymi rámcami Java, ako je Hibernate & Spring.

Máte na nás otázku? Uveďte to prosím v sekcii komentárov tohto článku a my sa vám ozveme čo najskôr.