标签:
package com.sunhang; //: containers/References.java // Demonstrates Reference objects import java.lang.ref.*; import java.util.*; class VeryBig { private static final int SIZE = 10000; private long[] la = new long[SIZE]; private String ident; public VeryBig(String id) { ident = id; } public String toString() { return ident; } protected void finalize() { System.out.println("Finalizing " + ident); } } public class References { private static ReferenceQueue<VeryBig> rq = new ReferenceQueue<VeryBig>(); public static void checkQueue() { // Reference<? extends VeryBig> inq = rq.poll(); // if(inq != null) // System.out.println("In queue: " + inq.get()); } public static void main(String[] args) throws InterruptedException { int size = 10; // Or, choose size via the command line: if(args.length > 0) size = new Integer(args[0]); LinkedList<SoftReference<VeryBig>> sa = new LinkedList<SoftReference<VeryBig>>(); for(int i = 0; i < size; i++) { sa.add(new SoftReference<VeryBig>( new VeryBig("Soft " + i), rq)); System.out.println("Just created: " + sa.getLast()); checkQueue(); } LinkedList<WeakReference<VeryBig>> wa = new LinkedList<WeakReference<VeryBig>>(); for(int i = 0; i < size; i++) { wa.add(new WeakReference<VeryBig>( new VeryBig("Weak " + i), rq)); System.out.println("Just created: " + wa.getLast()); checkQueue(); } SoftReference<VeryBig> s = new SoftReference<VeryBig>(new VeryBig("Soft")); WeakReference<VeryBig> w = new WeakReference<VeryBig>(new VeryBig("Weak")); System.gc(); LinkedList<PhantomReference<VeryBig>> pa = new LinkedList<PhantomReference<VeryBig>>(); for(int i = 0; i < size; i++) { pa.add(new PhantomReference<VeryBig>( new VeryBig("Phantom " + i), rq)); System.out.println("Just created: " + pa.getLast()); checkQueue(); } new Thread(){ @Override public void run() { try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } Reference<? extends VeryBig> inq = null; int count = 0; // while((inq = rq.poll()) != null){ // count ++; // System.out.println("inq:" + inq.get() + " count:" + count + " " + inq.getClass().getSimpleName()); // } synchronized (Reference.class){ try { Reference.class.wait(2000); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("again"); count = 0; while((inq = rq.poll()) != null){ count ++; System.out.println("inq:" + inq.get() + " count:" + count + " " + inq.getClass().getSimpleName()); } } }.start(); Thread.sleep(3000); System.gc(); Thread.sleep(15000); } } /* (Execute to see output) *///:~
这段代码我认为会把PhantomReference加入到ReferenceQueue中,但是结果中表示并没有加入到队列中。这是为什么呢?有机会研究一下?结果如下:
Just created: java.lang.ref.SoftReference@ab612f8
Just created: java.lang.ref.SoftReference@24e5ddd0
Just created: java.lang.ref.SoftReference@6f45959c
Just created: java.lang.ref.SoftReference@41616dd6
Just created: java.lang.ref.SoftReference@63721e22
Just created: java.lang.ref.SoftReference@986b0ee
Just created: java.lang.ref.SoftReference@69c9de24
Just created: java.lang.ref.SoftReference@441743be
Just created: java.lang.ref.SoftReference@536091de
Just created: java.lang.ref.SoftReference@6908b095
Just created: java.lang.ref.WeakReference@251e9862
Just created: java.lang.ref.WeakReference@67219b8c
Just created: java.lang.ref.WeakReference@663d0426
Just created: java.lang.ref.WeakReference@2fdb8f3a
Just created: java.lang.ref.WeakReference@77984161
Just created: java.lang.ref.WeakReference@2cec849e
Just created: java.lang.ref.WeakReference@5bf6b81c
Just created: java.lang.ref.WeakReference@4ffb06c9
Just created: java.lang.ref.WeakReference@697a9f24
Just created: java.lang.ref.WeakReference@71662a95
Just created: java.lang.ref.PhantomReference@7c669255
Finalizing Weak
Finalizing Weak 9
Finalizing Weak 8
Finalizing Weak 7
Finalizing Weak 6
Finalizing Weak 5
Finalizing Weak 4
Finalizing Weak 3
Finalizing Weak 2
Finalizing Weak 1
Finalizing Weak 0
Just created: java.lang.ref.PhantomReference@32114a41
Just created: java.lang.ref.PhantomReference@d220b15
Just created: java.lang.ref.PhantomReference@3605966f
Just created: java.lang.ref.PhantomReference@28d76d1e
Just created: java.lang.ref.PhantomReference@573ce184
Just created: java.lang.ref.PhantomReference@5df9cdda
Just created: java.lang.ref.PhantomReference@3b39d369
Just created: java.lang.ref.PhantomReference@5166b0df
Just created: java.lang.ref.PhantomReference@2ce62a39
Finalizing Phantom 4
Finalizing Phantom 5
Finalizing Phantom 7
Finalizing Phantom 6
Finalizing Phantom 0
Finalizing Phantom 1
Finalizing Phantom 2
Finalizing Phantom 3
Finalizing Phantom 9
Finalizing Phantom 8
again
inq:null count:1 WeakReference
inq:null count:2 WeakReference
inq:null count:3 WeakReference
inq:null count:4 WeakReference
inq:null count:5 WeakReference
inq:null count:6 WeakReference
inq:null count:7 WeakReference
inq:null count:8 WeakReference
inq:null count:9 WeakReference
inq:null count:10 WeakReference
标签:
原文地址:http://my.oschina.net/u/2291753/blog/477339