Bruke Guavas MapMaker

1. Introduksjon

MapMaker er en byggeklasse i Guava som gjør det enkelt å lage trådsikre kart.

Java støtter allerede WeakHashMap å bruke svake referanser for tastene. Men det er ingen løsning utenom boksen for å bruke det samme for verdiene. Heldigvis, MapMaker gir enkle byggemetoder å bruke Svak referanse for både tastene og verdiene.

I denne opplæringen, la oss se hvordan MapMaker gjør det enkelt å lage flere kart og bruke svake referanser.

2. Maven avhengighet

La oss først legge til Google Guava-avhengighet, som er tilgjengelig på Maven Central:

 com.google.guava guava 29.0-jre 

3. Et cacheeksempel

La oss vurdere et enkelt scenario hvor en server opprettholder et par hurtigbuffere for brukerne: en øktbuffer og en profilbuffer.

Sessionsbufferen er kortvarig og oppføringene blir ugyldige etter at brukeren ikke lenger er aktiv. Så hurtigbufferen kan fjerne oppføringen for brukeren etter at brukerobjektet er samlet inn søppel.

Profilbufferen kan imidlertid ha en høyere time-to-live (TTL). Oppføringene i profilbufferen blir bare ugyldige når brukeren oppdaterer profilen sin.

I dette tilfellet kan hurtigbufferen bare fjerne oppføringen når profilobjektet er søppeloppsamlet.

3.1. Datastrukturer

La oss lage klasser for å representere disse enhetene.

Vi begynner først med brukeren:

offentlig klasse bruker {privat lang id; privat strengnavn; offentlig bruker (lang id, strengnavn) {this.id = id; this.name = navn; } offentlig lang getId () {retur id; } public String getName () {return name; }}

Så økten:

offentlig klassesession {privat lang id; offentlig sesjon (lang id) {this.id = id; } offentlig lang getId () {retur id; }} 

Og til slutt profilen:

offentlig klasseprofil {privat lang id; privat streng type; offentlig profil (lang id, strengtype) {this.id = id; this.type = type; } offentlig lang getId () {retur id; } public String getName () {return type; }}

3.2. Opprette cachene

La oss lage en forekomst av ConcurrentMap for øktbufferen ved hjelp av makeMap metode:

ConcurrentMap sessionCache = ny MapMaker (). MakeMap ();

Det returnerte kartet tillater ikke nullverdier for både nøkkelen og verdien.

La oss nå opprette en annen forekomst av ConcurrentMap for profilbufferen:

ConcurrentMap profileCache = ny MapMaker (). MakeMap ();

Legg merke til at vi ikke har spesifisert startkapasiteten for cachene. Så,MapMaker oppretter et kart over kapasitet 16 som standard.

Hvis vi vil, kan vi endre kapasiteten ved hjelp av initialCapacity metode:

ConcurrentMap profileCache = ny MapMaker (). InitialCapacity (100) .makeMap ();

3.3. Endring av samtidighetsnivå

MapMaker settene standardverdien for samtidighetsnivået til 4. Imidlertid, den sessionCache trenger å støtte et større antall samtidige oppdateringer uten noen trådstrid.

Her, den samtidighetNivå byggemetoden kommer til unnsetning:

ConcurrentMap sessionCache = ny MapMaker (). ConcurrencyLevel (10) .makeMap ();

3.4. Bruke svake referanser

Kartene vi opprettet ovenfor bruker sterke referanser for både nøkler og verdier. Så, oppføringene blir værende på kartet, selv om nøklene og verdiene er samlet inn søppel. Vi bør bruke svake referanser i stedet.

EN sessionCache oppføringen er ugyldig etter at nøkkelen (brukerobjektet) er samlet inn søppel. Så la oss bruke svake referanser for tastene:

ConcurrentMap sessionCache = ny MapMaker (). WeakKeys (). MakeMap ();

For profileCache, kan vi bruke svake referanser for verdiene:

ConcurrentMap profileCache = ny MapMaker (). WeakValues ​​(). MakeMap ();

Når disse referansene blir samlet inn søppel, garanterer Guava at disse innganger vil ikke bli inkludert i noen av de påfølgende lese- eller skriveoperasjonene på kartet. Imidlertid, den størrelse() metoden kan noen ganger være inkonsekvent og kan inkludere disse innganger.

4. MapMaker Internals

MapMaker skaper en ConcurrentHashMap som standard hvis svake referanser ikke er aktivert. Likhetskontrollene skjer via den vanlige likemetoden.

Hvis vi aktiverer svake referanser, da MapMaker oppretter et tilpasset kart representert av et sett med hasjbord internt. Den deler også lignende ytelsesegenskaper som en ConcurrentHashMap.

Imidlertid en viktig forskjell med WeakHashMap er at likhetskontrollene skjer via identiteten (== og identityHashCode) sammenligninger.

5. Konklusjon

I denne korte artikkelen lærte vi hvordan vi bruker MapMaker klasse for å lage et trådsikkert kart. Vi så også hvordan du kan tilpasse kartet for å bruke svake referanser.

Som alltid er hele kildekoden til artikkelen tilgjengelig på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found