Brug af Guavas MapMaker

1. Introduktion

MapMaker er en bygherreklasse i Guava, der gør det let at oprette trådsikre kort.

Java understøtter allerede WeakHashMap at bruge svage referencer til tasterne. Men der er ingen out-of-the-box løsning til at bruge det samme til værdierne. Heldigvis MapMaker giver enkle bygningsmetoder at bruge Svag henvisning for både tasterne og værdierne.

Lad os se hvordan i denne vejledning MapMaker gør det nemt at oprette flere kort og bruge svage referencer.

2. Maven-afhængighed

Lad os først og fremmest tilføje Google Guava-afhængighed, som er tilgængelig på Maven Central:

 com.google.guava guava 29.0-jre 

3. Et cacheeksempel

Lad os overveje et simpelt scenario, hvor en server opretholder et par cacher for brugerne: en sessionscache og en profilcache.

Sessionscachen er kortvarig, og dens poster bliver ugyldige, efter at brugeren ikke længere er aktiv. Så cachen kan fjerne posten for brugeren, efter at brugerobjektet er skraldesamlet.

Profilcachen kan dog have en højere time-to-live (TTL). Indtastningerne i profilcachen bliver kun ugyldige, når brugeren opdaterer sin profil.

I dette tilfælde kan cachen kun fjerne posten, når profilobjektet er indsamlet skrald.

3.1. Datastrukturer

Lad os oprette klasser til at repræsentere disse enheder.

Vi starter først med brugeren:

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

Derefter sessionen:

offentlig klassesession {privat lang id; offentlig session (lang id) {this.id = id; } offentlig lang getId () {return id; }} 

Og endelig profilen:

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

3.2. Oprettelse af cacher

Lad os oprette en forekomst af ConcurrentMap til sessionens cache ved hjælp af makeMap metode:

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

Det returnerede kort tillader ikke nulværdier for både nøglen og værdien.

Lad os nu oprette en anden forekomst af ConcurrentMap til profilcachen:

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

Bemærk, at vi ikke har specificeret den oprindelige kapacitet til cacherne. Så,MapMaker opretter et kort over kapacitet 16 som standard.

Hvis vi vil, kan vi ændre kapaciteten ved hjælp af initialCapacity metode:

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

3.3. Ændring af samtidighedsniveauet

MapMaker sæt standardværdien for samtidighedsniveauet til 4. Men den sessionCache skal understøtte et større antal samtidige opdateringer uden nogen trådstrid.

Her, den concurrencyNiveau builder-metoden kommer til undsætning:

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

3.4. Brug af svage referencer

Kortene, vi oprettede ovenfor, bruger stærke referencer til både nøgler og værdier. Så, posterne forbliver på kortet, selvom nøglerne og værdierne er indsamlet skrald. Vi bør bruge svage referencer i stedet.

EN sessionCache indtastningen er ugyldig, efter at nøglen (brugerobjektet) er indsamlet skrald. Så lad os bruge svage referencer til tasterne:

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

Til profileCache, kan vi bruge svage referencer til værdierne:

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

Når disse referencer indsamles med skrald, garanterer Guava, at disse poster vil ikke blive inkluderet i nogen af ​​de efterfølgende læse- eller skrivehandlinger på kortet. Men den størrelse() metode kan undertiden være inkonsekvent og kan omfatte disse poster.

4. MapMaker Internals

MapMaker skaber en ConcurrentHashMap som standard, hvis svage referencer ikke er aktiveret. Ligestillingskontrol sker via den sædvanlige ligemetode.

Hvis vi aktiverer svage referencer, så MapMaker opretter et brugerdefineret kort repræsenteret af et sæt hash-tabeller internt. Det deler også lignende ydeevneegenskaber som en ConcurrentHashMap.

Dog en vigtig forskel med WeakHashMap er, at ligestillingskontrollerne sker via identiteten (== og identityHashCode) sammenligninger.

5. Konklusion

I denne korte artikel lærte vi, hvordan man bruger MapMaker klasse for at oprette et trådsikkert kort. Vi så også, hvordan man tilpasser kortet, så det bruger svage referencer.

Som altid er artiklens fulde kildekode tilgængelig på GitHub.


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