Java 引用
概述
实现
所有的引用类都实现自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(){
}
}