假设有两个对象A
和B
,并且有一个指针A.x --> B
,我们创建,比如说,WeakReference
s 到两个A
和B
,并带有一个关联的ReferenceQueue
。
假设两者都A
变得B
无法访问。直觉B
上不能认为是不可到达A
的。在这种情况下,我们是否能以某种方式保证各个引用将按直观(没有循环时的拓扑)顺序排列ReferenceQueue
?即 ref(A) 在 ref(B) 之前。我不知道——如果 GC 将一堆对象标记为无法访问,然后以不特定的顺序将它们排入队列会怎样?
我正在审查番石榴的Finalizer.java,看到这个片段:
private void cleanUp(Reference<?> reference) throws ShutDown {
...
if (reference == frqReference) {
/*
* The client no longer has a reference to the
* FinalizableReferenceQueue. We can stop.
*/
throw new ShutDown();
}
frqReference
是对 used 的 PhantomReference ReferenceQueue
,所以如果这是 GC'ed,没有 Finalizable{Weak, Soft, Phantom}References 可以是活动的,因为它们引用了队列。所以它们必须在队列本身可以被 GC 之前被 GC ——但是,我们是否得到保证这些引用将按ReferenceQueue
它们“收集垃圾”的顺序排入队列(就像他们得到 GC'一个接一个)?该代码暗示存在某种保证,否则理论上未处理的引用可能会保留在队列中。
谢谢