虚引用
虚引用是最弱的一种引用关系,如果一个对象仅持有虚引用,那么它就和没有任何引用一样。用 PhantomReference 类来表示,通过查看这个类的源码,发现它只有一个构造函数和一个 get() 方法,而且它的 get() 方法仅仅是返回一个null,也就是说将永远无法通过虚引用来获取对象,虚引用必须要和 ReferenceQueue 引用队列一起使用。
源码:
public class PhantomReference<T> extends Reference<T> {
/**
* Returns this reference object's referent. Because the referent of a
* phantom reference is always inaccessible, this method always returns
* <code>null</code>.
*
* @return <code>null</code>
*/
public T get() {
return null;
}
public PhantomReference(T referent, ReferenceQueue<? super T> q) {
super(referent, q);
}
}
// 调用
// 创建item对象的虚引用,并配套引用队列,可以通过引用队列获得对象,并在垃圾回收之前对对象做处理
FinalizerPhantomReference<T> reference = new FinalizerPhantomReference<>(item, referenceQueue, cleanup);
// 当item已经被回收之后,在references中获取这个对象的虚引用,将虚引用对象加入到ConcurrentHashMap中
references.put(reference, Boolean.TRUE);
具体使用:
private static class FinalizerPhantomReference<T>
extends PhantomReference<T>
{
private final AtomicBoolean cleaned = new AtomicBoolean(false);
private final Callable<?> cleanup;
// 虚引用的对象:referent,引用队列:queue
// 下面构造函数的目的是创建虚引用对象referent,并将它关联到引用队列queue。
private FinalizerPhantomReference(T referent, ReferenceQueue<? super T> queue, Callable<?> cleanup)
{
super(referent, queue);
this.cleanup = cleanup;
}
// ...其他方法
}