Guava MapMakerének használata

1. Bemutatkozás

Térképész egy építő osztály Guavában, amely megkönnyíti a szálbiztos térképek készítését.

A Java már támogatja WeakHashMap hogy a Gyenge referenciákat használja a kulcsokhoz. De nincs dobozon kívüli megoldás, amely ugyanazt használja az értékekhez. Szerencsére, Térképész egyszerű építői módszereket biztosít WeakReference mind a kulcsokhoz, mind az értékekhez.

Ebben az oktatóanyagban nézzük meg, hogyan Térképész megkönnyíti a több térkép létrehozását és a gyenge referenciák használatát.

2. Maven-függőség

Először tegyük hozzá a Google Guava függőséget, amely elérhető a Maven Central oldalon:

 com.google.guava guava 29.0-jre 

3. Gyorsítótár-példa

Vegyünk egy egyszerű forgatókönyvet arról, hogy egy kiszolgáló fenntart egy pár gyorsítótárat a felhasználók számára: munkamenet-gyorsítótárat és profil-gyorsítótárat.

A munkamenet-gyorsítótár rövid életű, bejegyzései érvénytelenné válnak, miután a felhasználó már nem aktív. Tehát a gyorsítótár eltávolíthatja a felhasználó bejegyzését, miután a felhasználói objektum szemetet gyűjt.

A profil-gyorsítótárnak azonban magasabb az élettartama (TTL). A profil-gyorsítótár bejegyzései csak akkor érvénytelenek, ha a felhasználó frissíti a profilját.

Ebben az esetben a gyorsítótár csak akkor távolíthatja el a bejegyzést, ha a profilobjektum szemetet gyűjt.

3.1. Adatszerkezetek

Hozzunk létre osztályokat ezeknek az entitásoknak a képviseletére.

Először a felhasználóval kezdjük:

public class Felhasználó {private long id; privát karakterlánc neve; public Felhasználó (hosszú id, String név) {this.id = id; ez.név = név; } public long getId () {return id; } public String getName () {visszatérési név; }}

Ezután a munkamenet:

public class Session {privát hosszú id; nyilvános munkamenet (hosszú id) {this.id = id; } public long getId () {return id; }} 

És végül a profil:

public class Profile {private long id; privát String típus; public Profile (hosszú id, String típus) {this.id = id; this.type = type; } public long getId () {return id; } public String getName () {return type; }}

3.2. A gyorsítótárak létrehozása

Hozzunk létre egy példányt ConcurrentMap a munkamenet-gyorsítótárhoz a makeMap módszer:

ConcurrentMap sessionCache = új MapMaker (). MakeMap ();

A visszaküldött térkép nem engedélyezi a kulcs és az érték nullértékeit.

Most hozzunk létre egy másik példányt ConcurrentMap a profil gyorsítótárához:

ConcurrentMap profileCache = új MapMaker (). MakeMap ();

Vegye figyelembe, hogy nem adtuk meg a gyorsítótárak kezdeti kapacitását. Így,Térképész alapértelmezés szerint létrehoz egy 16-os kapacitástérképet.

Ha akarjuk, módosíthatjuk a kapacitást a kezdeti Kapacitás módszer:

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

3.3. Az egyidejűségi szint megváltoztatása

Térképész készletek a párhuzamossági szint alapértelmezett értéke 4. Azonban a sessionCache nagyobb számú egyidejű frissítést kell támogatnia szálverseny nélkül.

Itt a concurrencyLevel építő módszer segít:

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

3.4. Gyenge hivatkozások használata

A fent létrehozott térképek mind a kulcsokhoz, mind az értékekhez erős hivatkozásokat használnak. Tehát a bejegyzések akkor is megmaradnak a térképen, ha a kulcsokat és az értékeket szeméttel gyűjtik össze. Helyette gyenge referenciákat kell használnunk.

A sessionCache a bejegyzés érvénytelen, miután a kulcs (a felhasználói objektum) szemetet gyűjtött. Tehát használjunk gyenge hivatkozásokat a kulcsokhoz:

ConcurrentMap sessionCache = új MapMaker (). SilpKeys (). MakeMap ();

A profileCache, gyenge referenciákat használhatunk az értékekhez:

ConcurrentMap profileCache = new MapMaker (). Gyenge értékek (). MakeMap ();

Amikor ezeket a referenciákat szeméttel gyűjtik össze, Guava garantálja, hogy ezek bejegyzés a térkép későbbi olvasási vagy írási műveleteibe nem kerül be. Azonban a méret() A módszer néha ellentmondásos lehet, és ezeket is tartalmazhatja bejegyzés.

4. Térképész Belsők

Térképész létrehoz egy ConcurrentHashMap alapértelmezés szerint, ha a gyenge referenciák nincsenek engedélyezve. Az egyenlőség ellenőrzése a szokásos egyenlő módszerrel történik.

Ha engedélyezzük a gyenge referenciákat, akkor Térképész létrehoz egy egyedi térképet belül hash táblák halmaza képviseli. Hasonló teljesítményjellemzőkkel rendelkezik, mint a ConcurrentHashMap.

Fontos különbség azonban a WeakHashMap az, hogy az egyenlőség ellenőrzése az identitáson keresztül történik (== és identityHashCode) összehasonlításokat.

5. Következtetés

Ebben a rövid cikkben megtanultuk a Térképész osztályban szálbiztos térkép készítéséhez. Azt is láttuk, hogyan lehet a térképet testre szabni gyenge referenciák felhasználásával.

Mint mindig, a cikk teljes forráskódja elérhető a GitHubon.