PhantomReference和ReferenceQueue之间有什么关系?

时间:2014-10-08 15:37:43

标签: java phantom-reference

我对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的理解是错误的,我向你道歉。

请简单描述这两个术语

非常感谢

1 个答案:

答案 0 :(得分:2)

PhantomReference#get() always returns null

  

返回此引用对象的引用对象。因为指称一个   幻像引用始终不可访问,此方法始终返回   空。

您无法通过get()知道是否收集了它。

  

如果是这样,为什么该对象仍未添加到优先级队列

javadoc

  

如果垃圾收集器确定某个时间点   幻像参考的指示物是幻像可达,然后就此   时间或某个晚些时候它会将参考队列入队列。

因此,在调用时间poll()(非阻塞)或实例被垃圾回收时,实例未被垃圾收集,但相应的PhantomReference未添加到{ {1}}。

您可以通过设置对ReferenceQueue的强引用并请求GC来帮助它,同时也阻止从队列中null remove。{/ p>

Reference
相关问题