Java PhantomReference和ReferenceQueue之间的关系是什么?
我对java中的PhantomReference有点困惑。当我查看在线文章时,大多数文章都提到,即使我们对引用调用get(),PhantomReference对象在创建后也会返回null,并且还提到,当PhantomReference从内存中删除时,对象是phantomly可访问的,将插入到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
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@user3115189System.gc()
是对垃圾收集器的一种建议,它可以垃圾收集任何东西。它使我们有更好的机会看到设备
对象被垃圾收集<调用code>queue.remove()
而不是poll()
,因为它阻止等待队列中的条目可用。请参阅我的答案中来自javadoc的引用。幻影引用可以稍后添加到队列中。我们想等到这一切发生。