"Szia ismét!"

– Most még egy csodálatos dologról fogok mesélni: a WeakReference-ről .

"Majdnem ugyanúgy néz ki, mint a SoftReference:"

Példa
// Create a Cat object
Cat cat = new Cat();

// Create a weak reference to a Cat object
WeakReference<Cat> catRef = new WeakReference<Cat>(cat);

// Now only the catRef weak reference points at the object
cat = null;

// Now the ordinary cat variable also references the object
cat = catRef.get();

// Clear the weak reference
catRef.clear();

"A gyenge referenciának van egy másik különlegessége is."

"Ha egy objektumnak nincsenek közönséges vagy lágy hivatkozásai, hanem csak gyenge hivatkozásai vannak, akkor az objektum él, de a következő szemétgyűjtéskor megsemmisül."

"Elmondhatja még egyszer? Mi a különbség ezek között a hivatkozások között?"

"Egy objektum, amelyet csak a SoftReference őriz meg a haláltól, annyi szemétgyűjtést képes túlélni , amennyit csak akar, és valószínűleg megsemmisül, ha nincs elegendő memória."

"Egy olyan objektum, amelyet csak egy WeakReference őriz meg a haláltól, nem éli túl a következő szemétgyűjtést. De amíg ez meg nem történik, megkaphatja az objektumot úgy, hogy meghívja a get() metódust a WeakReference- n , majd meghívja a metódusait, vagy mást csinál vele. ."

"Mi van, ha az objektumra SoftReference és WeakReference is hivatkozik?"

"Ez egyszerű. Ha legalább egy szabályos hivatkozás egy objektumra mutat, akkor azt élőnek tekintik. Egyébként az ilyen hivatkozást StrongReference-nek hívják."

"Ha a rendszeres hivatkozások nem mutatnak egy objektumra, a SoftReference viszont igen, akkor lágyan elérhető."

"Ha nem normál hivatkozások vagy SoftReferences mutatnak egy objektumra, de a WeakReference igen, akkor gyengén elérhető."

"Gondoljon bele. A SoftReference megvédi az objektumot a törléstől, és biztosítja, hogy az objektum csak akkor kerüljön törlésre, ha nincs elegendő memória. A WeakReference megtartja az objektumot a következő szemétgyűjtésig. A SoftReference nagyobb ellenállást biztosít a törléssel szemben."

– Ah. Azt hiszem, értem.

"Remek, akkor mesélek egy másik érdekes dolgot a WeakReferences-ről: a WeakHashMapről."

– Komolyan hangzik!

"És néhány! A WeakHashMap egy olyan HashMap, amelynek kulcsai gyenge hivatkozások (WeakReferences)."

"Azaz objektumokat ad hozzá egy ilyen HashMaphez, és dolgozik velük.

"Amíg a WeakHashMap-ben tárolt objektumok kulcsként rendszeres (erős vagy lágy) hivatkozásokat tartalmaznak, ezek az objektumok életben maradnak."

"De tegyük fel, hogy az egész alkalmazásban nincs több hivatkozás ezekre az objektumokra. Csak néhány WeakReferencia a WeakHashMap belsejében tartja meg őket attól, hogy meghaljanak. A következő szemétgyűjtés után az ilyen objektumok eltűnnek a WeakHashMapről. Maguktól. Mintha soha nem voltak ott."

– Nem biztos, hogy megértettem.

"A WeakHashMap-ben tárolja az objektumpárokat: egy kulcsot és egy értéket. A WeakHashMap azonban nem közvetlenül hivatkozik a kulcsokra, hanem a WeakReferences-en keresztül. Ezért amikor a kulcsként használt objektumok gyengén elérhetővé válnak, a következőnél megsemmisülnek. szemétgyűjtés. Ennek eredményeként értékeik automatikusan eltávolítódnak a WeakHashMapről is."

"Nagyon kényelmes a WeakHashMap használata bizonyos objektumokról további információk tárolására."

"Először is, az információhoz való hozzáférés nagyon egyszerű, ha magát az objektumot használja kulcsként."

"Másodszor, ha az objektum megsemmisül, eltűnik a HashMapről az összes kapcsolódó adattal együtt."

"Például:

Példa
// Create an object to store additional information about the user
WeakHashMap<User, StatisticInfo> userStatistics = new WeakHashMap<User, StatisticInfo>();

// Put information about the user into userStatistics
User user = session.getUser();
userStatistics.put(user, new StatisticInfo (…));

// Get information about the user from userStatistics
User user = session.getUser();
StatisticInfo statistics = userStatistics.get(user);

// Remove any information about the user from userStatistics
User user = session.getUser();
userStatistics.remove(user);
  1. "A WeakHashMap-en belül a kulcsok WeakReferences-ként vannak tárolva."
  2. "Amint a felhasználói objektumot a szemétgyűjtő megsemmisíti, a Remove(user) metódus implicit módon meghívásra kerül a WeakHashMap belsejében, és a felhasználói objektumhoz kapcsolódó minden információ automatikusan eltávolításra kerül a WeakHashMap-ről."

"Ez egy hatékony eszköznek tűnik. Hol tudom használni?"

"Ez a körülményektől függ. Tegyük fel, hogy van egy szál a programban, amely nyomon követi bizonyos objektumok által képviselt feladatok munkáját, és információkat ír róluk egy naplóba. Ez a szál a megfigyelt objektumokat egy WeakHashMap-ben tárolhatja. Amint Mivel az objektumokra nincs szükség, a szemétgyűjtő törli őket, és a rájuk való hivatkozások is automatikusan törlődnek a WeakHashMap-ről."

"Érdekesnek hangzik. Már most úgy érzem, hogy még nem írtam komoly Java-programokat, amelyek ilyen hatékony mechanizmusokat használnának. De ezen fogok dolgozni. Nagyon köszönöm, Ellie, ezt az érdekes leckét."