public static void main(String[] args) { String s = new String("helloworld"); ReferenceQueue rq = new ReferenceQueue(); PhantomReference pr = new PhantomReference(s, rq); s = null; System.out.println(pr.get()); // 系统无法通过虚引用来获得被引用的对象 System.gc(); System.runFinalization(); System.out.println(pr.get()); }
public static void main(String[] args) { String str = new String("Hello Java!"); ReferenceQueue<String> rq = new ReferenceQueue<String>(); // 創建一個虛引用,指向Hello Java! PhantomReference<String> pr = new PhantomReference<String>(str, rq); str = null; // 不能通過虛引用訪問被引用對象,所以此處為null System.out.println(pr.get()); System.gc(); System.runFinalization(); // 當被引用的對象回收后,虛引用將被放入引用隊列中 System.out.println(rq.poll() == pr); }
@Override public void clear() { try { System.out.println("clear " + this); } finally { super.clear(); } }
public static void main(String[] args) throws Exception { // 创建一个字符串对象 String str = new String("Struts2权威指南"); // 创建一个引用队列 ReferenceQueue rq = new ReferenceQueue(); // 创建一个虚引用,让此虚引用引用到"Struts2权威指南"字符串 PhantomReference pr = new PhantomReference(str, rq); // 切断str引用和"Struts2权威指南"字符串之间的引用 str = null; // 取出虚引用所引用的对象,并不能通过虚引用访问被引用的对象,所以此处输出null System.out.println(pr.get()); // 强制垃圾回收 System.gc(); System.runFinalization(); // 取出引用队列中最先进入队列中引用与pr进行比较 System.out.println(rq.poll() == pr); }
/** @param args */ public static void main(String[] args) { // 创建一个对象 Person person = new Person("Sunny"); // 创建一个引用队列 ReferenceQueue<Person> rq = new ReferenceQueue<Person>(); // 创建一个虚引用,让此虚引用引用到person对象 PhantomReference<Person> pr = new PhantomReference<Person>(person, rq); // 切断person引用变量和对象的引用 person = null; // 试图取出虚引用所引用的对象 // 发现程序并不能通过虚引用访问被引用对象,所以此处输出为null System.out.println(pr.get()); // 强制垃圾回收 System.gc(); System.runFinalization(); // 因为一旦虚引用中的对象被回收后,该虚引用就会进入引用队列中 // 所以用队列中最先进入队列中引用与pr进行比较,输出true System.out.println(rq.poll() == pr); }
@Override public void clear() { super.clear(); _singleContextId = 0; REFS.remove(this); }