我有一个共享资源,我想知道有多少其他对象仍在使用该资源。为此,我想使用PhantomReference
s。
由于ReferenceQueue
s 不跟踪为它们注册的引用(source,“通知”部分),我的想法是将引用存储为被跟踪对象的字段:
class Foo {
private PhantomReference<Foo> thisReference;
public Foo(ReferenceQueue<Foo> queue) {
thisReference = new PhantomReference<>(this, queue);
}
}
这是否安全,基于PhantomReference
s 的 Java 9(+) 行为,或者是否有可能在没有将引用添加到队列的情况下对实例进行垃圾收集?
文档说:
假设垃圾收集器在某个时间点确定对象是幻影可达的。那时,它将自动清除对该对象的所有幻像引用以及对该对象可从中访问的任何其他幻像可访问对象的所有幻像引用。在同一时间或稍后的某个时间,它会将那些在引用队列中注册的新清除的幻像引用排入队列。
但它没有提到垃圾收集是否可以在引用入队之前发生。