Java Tutorial/Reflection/PhantomReference

Материал из Java эксперт
Перейти к: навигация, поиск

A phantom reference is used to determine when an object is just about to be reclaimed.

   <source lang="java">

import java.lang.ref.PhantomReference; import java.lang.ref.Reference; import java.lang.ref.ReferenceQueue; public class Main {

 public static void main(String[] argv) throws Exception {
   ReferenceQueue rq = new ReferenceQueue();
   PhantomReference<String> pr = new PhantomReference<String>("object", rq);
   while (true) {
     Reference r = rq.remove();
     if (r == pr) {
       // about to be reclaimed.
       r.clear();
     }
   }
 }

}</source>





Testing PhantomReference

   <source lang="java">

import java.lang.ref.PhantomReference; import java.lang.ref.Reference; import java.lang.ref.ReferenceQueue; import java.lang.ref.SoftReference; import java.lang.ref.WeakReference; import java.util.HashMap; public class Main {

 public static void main(String[] args) {
   ReferenceQueue referenceQueue = new ReferenceQueue();
   Object object = new Object() {
     public String toString() {
       return "Referenced Object";
     }
   };
   Object data = new Object() {
     public String toString() {
       return "Data";
     }
   };
   HashMap map = new HashMap();
   Reference reference = null;
   System.out.println("Testing PhantomReference.");
   reference = new PhantomReference(object, referenceQueue);
   map.put(reference, data);
   System.out.println(reference.get());
   System.out.println(map.get(reference));
   System.out.println(reference.isEnqueued());
   System.gc();
   System.out.println(reference.get());
   System.out.println(map.get(reference));
   System.out.println(reference.isEnqueued());
   object = null;
   data = null;
   System.gc();
   System.out.println(reference.get());
   System.out.println(map.get(reference));
   System.out.println(reference.isEnqueued());
 }

}</source>