【发布时间】:2010-03-23 01:42:08
【问题描述】:
假设有两个对象,A 和 B,并且有一个指针 A.x --> B,我们创建了一个指向 A 和 B 的 WeakReferences,并带有一个关联的 @ 987654328@.
假设A 和B 都变得无法访问。直觉上,B 在A 之前不能被认为是不可访问的。在这种情况下,我们是否以某种方式保证各个引用将在ReferenceQueue 中以直观(没有循环时的拓扑)顺序排队? IE。参考(A)在参考(B)之前。我不知道——如果 GC 将一堆对象标记为无法访问,然后以不特定的顺序将它们排入队列会怎样?
我正在审查Finalizer.java的番石榴,看到这个sn-p:
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 是对使用过的ReferenceQueue 的 PhantomReference,因此如果这是 GC'ed,则任何 Finalizable{Weak, Soft, Phantom}Reference 都不会存在,因为它们引用了队列。因此,必须先对队列本身进行 GC,然后才能对它们进行 GC - 但是,我们是否可以保证这些引用将按照它们“收集垃圾”的顺序排入 ReferenceQueue(好像它们得到 GC 一个一个)?该代码暗示存在某种保证,否则理论上未处理的引用可能会保留在队列中。
谢谢
【问题讨论】:
标签: java reference garbage-collection guava