Gyenge hivatkozások a Java-ban

1. Áttekintés

Ebben a cikkben megnézzük a gyenge hivatkozás fogalmát - Java nyelven.

Megmagyarázzuk, mik ezek, mire használják őket, és hogyan kell velük megfelelően dolgozni.

2. Gyenge hivatkozások

A gyengén hivatkozott objektumot a Garbage Collector törli, amikor gyengén elérhető.

A gyenge elérhetőség azt jelenti, hogy egy az objektumnak nincsenek sem erős, sem lágy hivatkozásai. Az objektumot csak gyenge referencia áthaladásával lehet elérni.

Először is, a Garbage Collector törli a gyenge referenciát, így a referens már nem elérhető. Ezután a referencia egy referencia sorba kerül (ha van ilyen társítva), ahonnan megszerezhetjük.

Ugyanakkor a korábban gyengén elérhető objektumok véglegesítésre kerülnek.

2.1. Gyenge vs puha referenciák

Néha nem egyértelmű a gyenge és a puha referencia közötti különbség. A puha hivatkozások alapvetően nagy LRU gyorsítótárat jelentenek. Vagyis puha referenciákat használunk, amikor a referensnek jó esélye van arra, hogy a közeljövőben újra felhasználják.

Mivel egy puha referencia gyorsítótárként működik, akkor is elérhető lehet, még akkor is, ha maga a referens nem. Valójában egy puha referencia akkor és csak akkor jogosult gyűjtésre, ha:

  • A referens nem érhető el erősen
  • A puha referencia nem érhető el a közelmúltban

Tehát egy puha referencia percekig vagy akár órákig is elérhető lehet, miután a referens elérhetetlenné válik. Másrészt gyenge referencia csak addig lesz elérhető, amíg referense még mindig körül van.

3. Használjon tokokat

Amint azt a Java dokumentációja A kanonizáló leképezések megvalósításához leggyakrabban gyenge referenciákat használnak. A leképezést akkor hívjuk kanonizáltnak, ha egy adott értéknek csak egy példánya van. Az új objektum létrehozása helyett a meglévőt keresi meg a leképezésben, és használja.

Természetesen a e referenciák legismertebb használata a WeakHashMap osztály. Ez a Térkép felület, ahol minden kulcs tárolódik, mint gyenge hivatkozás az adott kulcsra. Amikor a Szemétgyűjtő eltávolít egy kulcsot, a kulcshoz társított entitás is törlődik.

További információkért tekintse meg a WeakHashMap útmutatót.

Egy másik terület, ahol felhasználhatók, az az Elévült Hallgató probléma.

Egy kiadó (vagy egy téma) erős hivatkozást mutat az összes előfizetőre (vagy hallgatóra), hogy értesítse őket a megtörtént eseményekről. A probléma akkor merül fel, amikor a hallgató nem tudja sikeresen leiratkozni a kiadóról.

Ezért a hallgató nem gyűjthető szeméttől, mivel a kiadó számára továbbra is rendelkezésre áll egy erős hivatkozás. Következésképpen előfordulhatnak memóriaszivárgások.

A probléma megoldása lehet egy olyan alany, akinek gyenge hivatkozása van egy megfigyelőre, amely lehetővé teszi az előbbi szemétgyűjtést anélkül, hogy le kellene iratkozni róla (vegye figyelembe, hogy ez nem teljes megoldás, és bemutat néhány más kérdést, amelyek nem ide terjed ki).

4. Gyenge referenciákkal való munka

A gyenge referenciákat a java.lang.ref.WeakReference osztály. Inicializálhatjuk úgy, hogy referenciát adunk át paraméterként. Opcionálisan a java.lang.ref.ReferenceQueue:

Object referent = új Object (); ReferenceQueue referenceQueue = új ReferenceQueue (); WeakReference gyengeReference1 = új WeakReference (referens); WeakReference gyengeReference2 = új WeakReference (referens, referenceQueue); 

A referencia referensét a kap metódust, és manuálisan eltávolította a egyértelmű módszer:

Object referent2 = gyengeReference1.get (); gyengeReference1.clear (); 

Az ilyen referenciákkal történő biztonságos munkavégzés mintája megegyezik a puha referenciákkal:

Object referent3 = gyengeReference2.get (); if (referent3! = null) {// GC még nem távolította el a példányt} else {// GC törölte a példányt}

5. Következtetés

Ebben a gyors bemutatóban megvizsgáltuk a gyenge referencia alacsony szintű koncepcióját a Java-ban - és ezekre a leggyakoribb forgatókönyvekre összpontosítottunk.