Slabé referencie v Jave

1. Prehľad

V tomto článku sa pozrieme na koncept slabej referencie - v jazyku Java.

Vysvetlíme, čo to je, na čo sa používajú a ako s nimi správne pracovať.

2. Slabé referencie

Slabo odkazovaný objekt je vyčistený Garbage Collectorom, keď je slabo dosiahnuteľný.

Slabá dosiahnuteľnosť znamená, že objekt nemá ani silné, ani mäkké odkazy, ktoré by naň odkazovali. K objektu sa dá dostať iba prekonaním slabej referencie.

Po prvé, garbage collector vymaže slabú referenciu, takže referent už nie je prístupný. Potom je referencia umiestnená do referenčného frontu (ak nejaký existuje), odkiaľ ho môžeme získať.

Zároveň sa dokončia aj predtým slabo dostupné objekty.

2.1. Slabé vs mäkké referencie

Rozdiel medzi slabými a mäkkými referenciami je niekedy nejasný. Mäkké referencie sú v podstate veľkou medzipamäťou LRU. To znamená, mäkké referencie používame, keď má referent dobrú šancu na ďalšie použitie v blízkej budúcnosti.

Pretože mäkký odkaz funguje ako vyrovnávacia pamäť, môže byť naďalej dosiahnuteľný, aj keď samotný referent nie je. Softvérová referencia je v skutočnosti oprávnená na zber, len ak:

  • Referent nie je veľmi dobre dosiahnuteľný
  • Mäkký odkaz nie je v poslednej dobe prístupný

Mäkký odkaz môže byť k dispozícii niekoľko minút alebo dokonca hodín potom, čo sa stane nedostupným. Na druhej strane slabá referencia bude k dispozícii iba dovtedy, kým bude stále k dispozícii.

3. Prípady použitia

Ako uvádza dokumentácia Java, slabé referencie sa najčastejšie používajú na implementáciu kanonikalizácie mapovaní. Mapovanie sa nazýva kanonizované, ak obsahuje iba jednu inštanciu konkrétnej hodnoty. Namiesto vytvorenia nového objektu vyhľadá v mapovaní ten existujúci a použije ho.

Samozrejme, že Najznámejšie použitie týchto odkazov je WeakHashMap trieda. Je to implementácia Mapa rozhranie, kde je každý kľúč uložený ako slabý odkaz na daný kľúč. Keď program Garbage Collector odstráni kľúč, bude odstránená aj entita spojená s týmto kľúčom.

Ďalšie informácie nájdete v našom sprievodcovi po WeakHashMap.

Ďalšou oblasťou, kde sa dajú použiť, je problém Lapsed Listener.

Vydavateľ (alebo subjekt) má silné referencie na všetkých predplatiteľov (alebo poslucháčov), aby ich informoval o udalostiach, ktoré sa stali. Problém nastáva, keď sa poslucháč nemôže úspešne odhlásiť z vydavateľstva.

Preto nemožno poslucháča zbierať odpadky, pretože vydavateľ má k dispozícii silný odkaz na to, že je stále k dispozícii. V dôsledku toho môže dôjsť k úniku pamäte.

Riešením problému môže byť subjekt, ktorý má slabý odkaz na pozorovateľa, ktorý umožňuje zbierať odpadky bez toho, aby ich bolo potrebné odhlasovať (upozorňujeme, že nejde o úplné riešenie, a zavádza niektoré ďalšie problémy, ktoré nie sú úplné. pokryté tu).

4. Práca so slabými referenciami

Slabé referencie predstavuje java.lang.ref.WeakReference trieda. Môžeme ho inicializovať odovzdaním referenta ako parametra. Voliteľne môžeme poskytnúť a java.lang.ref.ReferenceQueue:

Referent objektu = nový objekt (); ReferenceQueue referenceQueue = nový ReferenceQueue (); WeakReference slabáReferencia1 = nová WeakReference (referent); WeakReference slabáReferencia2 = nová WeakReference (referent, referenceQueue); 

Referenta referencie je možné načítať pomocou dostať metódou a ručne odstrániť pomocou jasný metóda:

Objekt referent2 = strongReference1.get (); strongReference1.clear (); 

Vzor bezpečnej práce s týmto druhom odkazov je rovnaký ako v prípade mäkkých odkazov:

Objekt referent3 = strongReference2.get (); if (referent3! = null) {// GC inštanciu ešte neodstránil} else {// GC inštanciu vymazal}

5. Záver

V tomto rýchlom výučbe sme sa pozreli na nízkoúrovňový koncept slabej referencie v Jave - a zamerali sme sa na najbežnejšie scenáre ich použitia.