Kuidas Java-s samaaegset räsimiskaarti kõige paremini rakendada?



See artikkel tutvustab teile mõistet, mida nimetatakse Java samaaegseks räsimiskaardiks, ja järgige seda praktilise tutvustusega

See artikkel tutvustab teile mõistet, mida nimetatakse samaaegseks räsi kaardiks ja järgige seda praktilise tutvustusega. Järgmisi näpunäiteid käsitletakse selles artiklis,

Selle artikliga edasi liikumine Java samaaegses räsimiskaardis





Kuidas ConcurrentHashMap sisemiselt töötab?

Java 5-st alates on HashTable'i alternatiivina kasutusel ConcurrentHashMap. Saame ka sünkroniseeritud kaardi, kasutades utiliidiklassi meetodit nimega synchronizedMap (), kuid sellel meetodil on ka puudus, st väga halb jõudlus, kuna korraga saab sellele juurde pääseda ainult üks lõim. Nii lahendab ConcurrentHashMap need probleemid.



Selle artikliga edasi liikumine Java samaaegses räsimiskaardis

Miks muu kaart?

Kuigi meil on juba olemas HashMap, HashTable, on vaja ConcurrentHashMap'i, sest see tagab parema jõudluse ja on samal ajal niidikindel.

Selle artikliga edasi liikumine Java samaaegses räsimiskaardis



Kuidas see erineb?

See põhineb ka räsimisel, kuid selle lukustusstrateegia parandab selle toimivust. Erinevalt HashTable'ist või sünkroonitud HashMapist ei rakenda see iga meetodi jaoks sama lukku, mida ta kasutab iga meetodi jaoks eraldi lukuga. Ta kasutab selleks uuesti siseneja lukku. Sarnaselt HashMapiga on ka ConcurrentHashMapil 16 ämbrit, st segmente. Üle 16 ämbriga ConcurrentHashMapi loomiseks on sellel erinevad konstruktorid.

Enne üksikasjalikku rääkimist vaadake allpool mõned mõisted:

ConcurrentHashMap: see kaart võimaldab samaaegset lõime juurdepääsu. Kaardi lisamisel või värskendamisel lukustatakse ainult osa kaardist, mida nimetatakse segmendiks, st aluseks olev andmete struktuur. See võimaldab samaaegset niidi juurdepääsu andmetele lukustamata lugeda. Seda tutvustati jõudluse parandamiseks.

  • Samaaegsuse tase: see on arv, mis on samaaegselt värskendatavate lõimede hinnanguline arv.
  • Koormustegur: see on väärtus, mida kasutatakse suuruse muutmise teguri juhtimiseks.
  • Esmane maht: see on omadus, mis loob määratud suurusega kaardi.

Vaatame allpool olevat skeemi ja proovime mõista, kuidas ConcurrentHashMap töötab.

Pilt- samaaegne hashap- Edureka

Nii et ülaltoodud diagrammil on meil 16 lukku, mis lukustavad ainult osa kaardist, mis on vajalik, et muudele meetoditele oleks võimalik juurde pääseda erinevate niitide abil, parandades seeläbi jõudlust.

Sarnaselt HashMapiga töötab ka ConcurrentHashMap sarnaselt, sisaldab vaikimisi 16 segmenti ja salvestab elemendi räsimisel, nii et kui elementidel on sama räsi, siis on need lingitud loendi abil samale segmendile salvestatud, nagu on näidatud ülaltoodud diagrammil.

Selle artikliga edasi liikumine Java samaaegses räsimiskaardis

Erinevus ConcurrentHashMapi ja HashMapi vahel

HashMap kuulub kogudesse, samas kui ConcurrentHashMap kuulub samaaegsetesse kogudesse, kuid nende vahel on palju muid erinevusi.

  • ConcurrentHashMap onNiidikindel s.t.sünkroonitud, kuid HashMap pole sünkroonitud.
  • ConcurrentHashMapi jõudlus on madal, kuna see on sünkroonitud, sest mõnikord peavad lõimed ootama, kuid HashMapi jõudlus on suur, kuna see pole sünkroonitud ja kõik lõimed saavad sellele samaaegselt juurde pääseda.
  • Saame ConcurrentModificationExceptioni, kui kaks lõime üritavad samaaegselt objekti sisu muuta või lisada. Kuid ConcurrentHashMapi puhul ei saa me sama toimingu sooritamisel erandeid.

  • HashMapis on võtme ja väärtuste jaoks nullväärtused lubatud, kuid ConcurrentHashMap ei luba võtme nullväärtusi ja väärtust, mida ta üritas nullväärtuse lisamiseks saada, saame erandi, st NullPointerException.

  • HashMap on kasutusel JDK 1.2-s, samal ajal kui ConcurrentHashMap on kasutusel JDK 1.5-s.

Nagu parema jõudluse tagamiseks juba varem nägime, koosneb see laudade ämbritena olevast sõlmedest, mis olid enne Java 8 .

Esimese sisestamise korral alustatakse koppade laisalt initsialiseerimist. Iga kopa saab iseseisvalt lukustada, lukustades kopa esimese sõlme, ei blokeeri ka lugemistoimingud.

Võrreldes HashMap, ConcurrentHashMap annab lisa samaaegsusTase argument kasutatavate hinnanguliste lõimede arvu kontrollimiseks.

Konstruktorid:

  1. ConcurrentHashMap m = uus ConcurrentHashMap ()

    Luuakse uus tühi kaart algse vaikimisi võimsusega 16, koormusteguriga 0,75 ja samaaegsustasemega 16.

  2. ConcurrentHashMap m = uus ConcurrentHashMap (int initialCapacity)
    Luuakse uus tühi kaart, mille esialgne maht on määratud, koormustegur on 0,75 ja samaaegsuse tase 16.

    diff hashmap ja hashtable vahel
  3. ConcurrentHashMap m = uus ConcurrentHashMap (int initialCapacity, float loadFactor)

    Luuakse uus tühi kaart, millel on määratud algne maht ja koormustegur koos samaaegsuse tasemega 16.

  4. ConcurrentHashMap m = uus ConcurrentHashMap (int initialCapacity, float loadFactor, int concurrencyLevel)
    Luuakse uus tühi kaart, millel on määratud esialgne maht, koormustegur ja samaaegsusaste.

  5. ConcurrentHashMap m = uus ConcurrentHashMap (kaart m)
    Loob pakutavalt kaardilt uue ConcurrentHashMapi.

Kaks ülejäänud argumenti: initialCapacity ja loadFactor töötasid üsna samamoodi nagu HashMap.
ConcurrentMap on mälu, mis vastab võtme / väärtuse toimingutele mitmekeermelises keskkonnas.

Selle artikliga edasi liikumine Java samaaegses räsimiskaardis

Lõkse

Objektide allalaadimise ajal pole ConcurrentHashMap blokeeritud ja võib värskendustoimingutega kattuda, seega parema jõudluse tagamiseks toovad nad sisse ainult viimati lõpetatud värskendustoimingud.

Olekumeetodite koondmeetodite tulemused, sealhulgas suurus, isEmpty ja includValue, on tavaliselt kasulikud ainult siis, kui kaarti ei muudeta samaaegselt teistes lõimedes.

Kui samaaegseid värskendusi kontrollitakse õigesti, võivad need olekumeetodid olla usaldusväärsed.

Kuigi need meetodid ei taga reaalajas.

Vaikimisi on tabeli maht 16, kuid me saame seda muuta samaaegsuse taseme abil.

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

Kui võtmete võtmed peavad olema järjestatud, võime kasutada ConcurrentSkipListMap.

Pärast ülaltoodud programmi käivitamist oleksite mõistnud Java samaaegset räsimiskaarti. Seega oleme jõudnud selle artikli lõpuni. Kui soovite rohkem teada saada, vaadake järgmist , usaldusväärne veebipõhine õppefirma. Edureka Java J2EE ja SOA koolitus- ja sertifitseerimiskursus on mõeldud selleks, et õpetada teid nii Java põhiliste kui ka edasijõudnute kontseptsioonide jaoks koos erinevate Java-raamistikega nagu Hibernate & Spring.

Kas teil on meile küsimus? Palun mainige seda selle artikli kommentaaride jaotises ja võtame teiega ühendust niipea kui võimalik.