Přeskočit na obsah

Phantom reference

Z Wikipedie, otevřené encyklopedie
(rozdíl) ← Starší revize | zobrazit aktuální verzi (rozdíl) | Novější revize → (rozdíl)

Phantom reference

Phantom reference je označena v jazyce Java reference, která je vytvořena pomocí třídy java.lang.ref.PhantomReference a dovoluje zabalit objekt na který ukazuje. Na rozdíl od normálmí silné (strong) reference dovoluje, aby objekt na který ukazuje referent mohl být, uvolněn Garbage_collector a poté smazán z paměti. Phantom reference je vhodná ke sledovnání, odkazovaného objektu jestli se stal nedostupný a neoživitelný, k provedení různých operací jako jsou nahrátí dalších velkých souborů, aby nedošlo k chybě OutOfMemoryError nebo k provedení závěrečných operací po životě objektu (uvolňování neuvolněných zdrojů) mnohem efektivněji a lépe než je tomu u funkce finalize(). Třída java.ref.PhantomReference je rozšíření jeho předka java.ref.Reference a tak z ní dědí i funkci get(), která by měla vrátit odkaz na odkazovaný objekt PhantomReference (referenta), ale jelikož je tento objekt už nedostupný a neoživitelný vrací null. Phantom reference je tedy použitelná jen s Reference Queue (Odkazovací frontou). Díky této frontě poznáme, že se referent dostal do Phantom dostupného stavu (není oživitelný a je určen k smazání z paměti), tím že bude do této fronty přidána pomocí garbage collectoru na referenta odkazující Phantom reference. K Phantom referenci je možné přiřadit vždy jen jeden odkaz a vždy jen jednu frontu a to vždy při jeho vytvoření přidáním odkazů na referenta a na frontu do jeho konstruktoru. Phantom reference se automaticky nečistí.

Příklad použití

Následují příklad ukazuje použití s Phantom referencí

package javaWiki;

import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;

public class PhantomRef {

	public static void main(String[] args) {
		Object o = new Object();
		ReferenceQueue<PhantomReference<Object>> q = new ReferenceQueue<PhantomReference<Object>>();

		PhantomReference pRef = new PhantomReference(o,q);
		
		// pouzivani objektu o
		o.hashCode();
		
		// jako by se objekt o dostal mimo rozsah
		// svoji dostupnosti 
		o = null;
		
		// cekani az garbage collector prida pRef do fronty
		
		while(true){
			System.gc();
			System.runFinalization();
			PhantomReference pRef2 = null;
			try {
				// blokovaci operace remove(), ceka az garbage collector
				// prida objekt pRef do fronty
				pRef2 = (PhantomReference) q.remove(200);
			} catch (IllegalArgumentException e) {
				e.printStackTrace();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			if (pRef2 != null){
				System.out.println("object o byl pridan do fronty" +
						" a je pripraven ke smazani z pameti");
				pRef.clear();
				break;
			} else {
				System.out.println("nepovedlo se");
			}
		}
	}
}


Známe také jiné druhy referencí z balíku java.lang.ref než je Phantom reference a to Soft reference a Weak reference, každá určená k jiné práci.