Java PhantomReference和ReferenceQueue之间的关系是什么?

Java PhantomReference和ReferenceQueue之间的关系是什么?,java,phantom-reference,Java,Phantom Reference,我对java中的PhantomReference有点困惑。当我查看在线文章时,大多数文章都提到,即使我们对引用调用get(),PhantomReference对象在创建后也会返回null,并且还提到,当PhantomReference从内存中删除时,对象是phantomly可访问的,将插入到ReferenceQueue中 我尝试了下面的代码示例,但对结果感到困惑 Equipment equipment = new Equipment(); ReferenceQueue queue = new

我对java中的PhantomReference有点困惑。当我查看在线文章时,大多数文章都提到,即使我们对引用调用get(),PhantomReference对象在创建后也会返回null,并且还提到,当PhantomReference从内存中删除时,对象是phantomly可访问的,将插入到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()); 
以上两条语句打印空值。如果pr.get()返回null,是否意味着pr引用的对象被垃圾收集? 如果是这样,为什么还没有将对象添加到优先级队列中

有人能帮我澄清一下吗。如果我对PhantomReference和ReferenceQueue的理解有误,我向您道歉

请简单描述这两个术语

非常感谢

返回此引用对象的引用对象。因为 幻影引用始终不可访问,此方法始终返回 空

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

如果是这样,为什么对象还没有添加到优先级队列中

美国

如果垃圾收集器在某个时间点确定 幻影引用的引用对象是幻影可及的,然后 时间或稍后某个时间它将使引用排队

因此,要么实例在调用
poll()
(非阻塞)时未被垃圾收集,要么实例已被垃圾收集,但相应的
PhantomReference
未添加到
ReferenceQueue

您可以将强引用设置为
null
并请求GC,但也可以阻止从队列中删除
引用

equipment = null;
System.out.println(pr.get());
System.gc();
System.out.println(queue.remove()); // block and wait for it to be added

感谢您的回答,它帮助我更清楚地理解了上下文,但我想知道您为什么调用System.gc();然后调用queue.remove()。你能解释一下吗it@user3115189
System.gc()
是对垃圾收集器的一种建议,它可以垃圾收集任何东西。它使我们有更好的机会看到
设备
对象被垃圾收集<调用code>queue.remove()
而不是
poll()
,因为它阻止等待队列中的条目可用。请参阅我的答案中来自javadoc的引用。幻影引用可以稍后添加到队列中。我们想等到这一切发生。