为了账号安全,请及时绑定邮箱和手机立即绑定

关于虚引用PhantomReference

关于虚引用PhantomReference

Smart猫小萌 2019-02-17 11:06:38
在<<深入理解Java虚拟机>>3.2.3中有这么一句话 “为一个对象设置虚引用关联的唯一目的就是能在这个对象被收集器回收时收到一个系统通知。” 请问利用虚引用在对象被回收时收到一个系统通知要怎么实现呢?能提供下示例代码吗?
查看完整描述

1 回答

?
墨色风雨

TA贡献1853条经验 获得超6个赞

这里看到了PhantomReference的用法:

import java.lang.ref.PhantomReference;
import java.lang.ref.Reference;
import java.lang.ref.ReferenceQueue;
import java.lang.reflect.Field;

public class Test {
    public static boolean isRun = true;

    @SuppressWarnings("static-access")
    public static void main(String[] args) throws Exception {
        String abc = new String("abc");
        System.out.println(abc.getClass() + "@" + abc.hashCode());
        final ReferenceQueue<String> referenceQueue = new ReferenceQueue<String>();
        new Thread() {
            public void run() {
                while (isRun) {
                    Object obj = referenceQueue.poll();
                    if (obj != null) {
                        try {
                            Field rereferent = Reference.class
                                    .getDeclaredField("referent");
                            rereferent.setAccessible(true);
                            Object result = rereferent.get(obj);
                            System.out.println("gc will collect:"
                                    + result.getClass() + "@"
                                    + result.hashCode() + "\t"
                                    + (String) result);
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        }.start();
        PhantomReference<String> abcWeakRef = new PhantomReference<String>(abc,
                referenceQueue);
        abc = null;
        Thread.currentThread().sleep(3000);
        System.gc();
        Thread.currentThread().sleep(3000);
        isRun = false;
    }
}

原来要和ReferenceQueue搭配使用。

查看完整回答
反对 回复 2019-03-01
  • 1 回答
  • 0 关注
  • 427 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号