概述

实现

所有的引用类都实现自Reference类。Reference类是一个抽象类,有一个静态代码块初始化一个线程来处理引用。

static{
    // 得到当前线程的线程组
    ThreadGroup tg = Thread.currentThread().getThreadGroup();
    for(ThreadGroup tgn = tg; tgn != null; 
        tg = tgn,tgn = tg.getParent());// 得到根线程组
    Thread handler = new ReferenceHandler(tg, "Reference Handler");// 处理 引用对象的线程
    handler.setPriority(Thread.MAX_PRIORITY);// 设置最大优先级
    handler.setDaemon(true);
    handler.start();
    // provide access in SharedSecrets
    SharedSecrets.setJavaLangRefAccess(new JavaLangRefAccess(){
        @Override
        public boolean tryHandlePendingReference(){
            return tryHandlePending(false);
        }
    });
}

/* High-priority thread to enqueue pending References
*/
private static class ReferenceHandler extends Thread{
    /**
    *
    */
    private static void ensureClassInitialized(Class<?> clazz){
        try{
            Class.forName(clazz.getName(), true, clazz.getClassLoader());
        }   catch(ClassNotFoundException e){
            // 将异常转化为错误
            throw (Error) new NoClassDefFoundError(e.getMessage()).initCause(e);
        }
    }
    
    // 初始化
    static{
        // pre-load and initialize InterrupteException and Cleaner class
        // so that we don't get inio trouble later in the run loop if there's
        // memory shortage while loading/initializing them lazily.
        ensureClassInitialized(InterruptedException.class);
        ensureClassInitialized(Cleaner.class);
    }
    
    ReferenceHandler(ThreadGroup g, String name){
        super(g, name);
    }
    
    public void run(){
        while(true){
            tryHandlePending(true);
        }
    }  
}

static boolean tryHandlePending(boolean waitForNotify){
    Reference<Object> r;
    Cleaner c;
    try{
        synchronized(lock){
            if(pending = null){
                r = pending;
            }
        }
    }catch(){
        
    }
}