虚引用 PhantomReference

/**
 * Date: 2021/5/21 15:07
 * 虚引用:
 * java 提供了4种引用类型,在垃圾回收的时候,都有自己各自的特点
 * ReferenceQueue是用来配合引用工作的,没有ReferenceQueue一样可以运行
 *
 * 创建引用的时候可以指定关联的队列,当GC释放对象内存的时候,会将引用加入到引用队列
 * 如果程序发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象的内存被回收之前采取必要的的行动
 * 这相当于是一种通知机制
 *
 * 当关联的引用队列中有数据的时候,意味着引用指向的堆内存中对象被回收。通过这种方式,JVM允许我们在对象被销毁后做一些我们自己想做的事情
 */
public class PhantomReferenceDemo {
    public static void main(String[] args) throws InterruptedException {
        Object o1 = new Object();
        ReferenceQueue<Object> referenceQueue = new ReferenceQueue<>();
        PhantomReference<Object> phantomReference = new PhantomReference<>(o1, referenceQueue);

        System.out.println(o1);
        System.out.println(phantomReference .get());
        System.out.println(referenceQueue.poll());

        System.out.println("===============================");

        o1 = null;
        System.gc();
        Thread.sleep(500);  // 保证一定被GC

        System.out.println(o1);
        System.out.println(phantomReference .get());
        System.out.println(referenceQueue.poll());   // GC前会将引用放入队列
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容