gpt4 book ai didi

java - PhantomReference和ReferenceQueue之间有什么关系?

转载 作者:行者123 更新时间:2023-11-30 03:43:42 24 4
gpt4 key购买 nike

我对 java 中的 PhantomReference 有一点困惑。当我查看在线文章时,大多数人都提到即使我们对引用调用 get(),PhantomReference 对象在创建后也会返回 null,并且还提到当从 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 的理解有误,我向您表示歉意。

请简单描述一下这两个术语

非常感谢

最佳答案

PhantomReference#get() always returns null

Returns this reference object's referent. Because the referent of a phantom reference is always inaccessible, this method always returns null.

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

If it is so, why the object is still haven't added to the priority queue

javadoc

If the garbage collector determines at a certain point in time that the referent of a phantom reference is phantom reachable, then at that time or at some later time it will enqueue the reference.

因此,要么在调用 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

关于java - PhantomReference和ReferenceQueue之间有什么关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26260915/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com