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.