什么是虚引用?它的作用是什么?代码举例讲解

虚引用(PhantomReference)是最弱的一种引用,它唯一的作用是跟踪对象被垃圾回收的活动。虚引用与软引用和弱引用的区别在于:虚引用的get()方法总是返回null,意味着程序无法获得虚引用关联对象的实例。

虚引用的作用是:

  1. 无法通过虚引用访问对象,它仅用来跟踪对象被垃圾回收的过程。
  2. 对象被垃圾回收后,虚引用会收到系统通知,可以执行后续操作。这类似于对象的finalize()方法。
  3. 虚引用常用于对象回收后的后续处理,例如关闭与对象关联的文件等资源。

我们可以通过java.lang.ref.PhantomReference类来实现虚引用。构造方法为:

PhantomReference(T referent, ReferenceQueue<? super T> queue) 

其中T是指向对象的类型,queue是关联的引用队列,用来接收对象被回收后的通知。

来看一个简单示例:

public class PhantomRefDemo {
    private static ReferenceQueue<Object> queue = new ReferenceQueue<>();

    public static void main(String[] args) {
        Object obj1 = new Object();
        PhantomReference<Object> ref1 = new PhantomReference<>(obj1, queue);
        obj1 = null;         // 可回收

        System.gc();        

        Reference<? extends Object> ref = queue.poll();
        if(ref != null) {
            System.out.println("obj1已被回收"); 
        }
    }
}

执行结果为:

obj1已被回收

在该示例中:

  1. obj1作为虚引用ref1的关联对象,关联到引用队列queue。
  2. 设置obj1为null,使其成为垃圾。
  3. 显式调用GC,这时obj1被回收,queue会接收到通知。
  4. 从queue中poll出关联的虚引用,如果不为空,说明obj1已被回收。