Скажем, есть два объекта, 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
- это PhantomReference на используемый ReferenceQueue
, так что если этоGC'ed, нет Finalizable {Weak, Soft, Phantom} Ссылки могут быть живы, так как они ссылаются на очередь.Таким образом, они должны быть GC'ed, прежде чем сама очередь может быть GC'ed - но тем не менее, мы получаем гарантию, что эти ссылки будут помещены в ReferenceQueue
в том порядке, в котором они «собраны» (как будто ониполучить GC'ed один за другим)?Код подразумевает, что существует какая-то гарантия, иначе необработанные ссылки теоретически могут остаться в очереди.
Спасибо