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