我对Java中的PhantomReference有点困惑。当我查看在线文章时,他们中的大多数都提到PhantomReference对象在创建后将返回null,即使我们在引用上调用get(),并且它还提到当PhantomReference从PhantomReference中删除时,将以幻象可达的对象插入到ReferenceQueue中。记忆。
我尝试了以下代码示例,但我对结果感到困惑。
Equipment equipment = new Equipment();
ReferenceQueue queue = new ReferenceQueue();
PhantomReference pr = new PhantomReference(equipment, queue);
System.out.println(pr.get());
System.out.println(queue.poll());
以上两个语句打印为null。如果pr.get()返回null,是否意味着pr引用的对象是垃圾收集的? 如果是这样,为什么对象仍然没有被添加到优先级队列?
任何人都可以帮我解释一下。如果我对PhantomReference和ReferenceQueue的理解是错误的,我向你道歉。
请简单描述这两个术语
非常感谢
答案 0 :(得分:2)
PhantomReference#get()
always returns null
。
返回此引用对象的引用对象。因为指称一个 幻像引用始终不可访问,此方法始终返回 空。
您无法通过get()
知道是否收集了它。
如果是这样,为什么该对象仍未添加到优先级队列
如果垃圾收集器确定某个时间点 幻像参考的指示物是幻像可达,然后就此 时间或某个晚些时候它会将参考队列入队列。
因此,在调用时间poll()
(非阻塞)或实例被垃圾回收时,实例未被垃圾收集,但相应的PhantomReference
未添加到{ {1}}。
您可以通过设置对ReferenceQueue
的强引用并请求GC来帮助它,同时也阻止从队列中null
remove
。{/ p>
Reference