Согласно the source code, он использует класс PhantomReference. В соответствии с документацией:
Фантомные ссылочные объекты, которые находятся в очереди после сбора, определяют, что их референты могут быть повторно восстановлены. Фантомные ссылки чаще всего используются для планирования действий над вскрытием более гибким способом, чем это возможно с механизмом завершения Java.
Если сборщик мусора определяет в определенный момент времени, что референт фантомной ссылки является фантомным достижимым, то в это время или в какое-то позднее время оно будет выдавать ссылку.
Для обеспечения того, чтобы возвращаемый объект оставался таким, референт фантомной ссылки не может быть получен: метод get фантомной ссылки всегда возвращает null.
В отличие от мягких и слабых ссылок, фантомные ссылки автоматически не очищаются сборщиком мусора, поскольку они находятся в очереди. Объект, доступный через фантомные ссылки, останется таким, пока все такие ссылки не будут очищены или сами не станут недоступными.
PhantomReference
конструктор принимает два аргумента:
referent
- объект новый опорный фантом будет ссылаться на
q
- очередь, с которой ссылка должна быть зарегистрирована, или нулевое значение, если регистрация не требуется
q
аргумент является inst класс ReferenceQueue
. PhantomReference
будет добавлен к этому ReferenceQueue
, когда он referent
станет доступным для фантома. Когда это произойдет, вы можете получить PhantomReference
с помощью методов poll()
или remove()
класса ReferenceQueue
.
Например:
T objectToWatch = ...;
ReferenceQueue<T> referenceQueue = new ReferenceQueue<T>();
new PhantomReference<T>(objectToWatch, referenceQueue);
// Later on, probably in another thread...
Reference<? extends T> nextReference = referenceQueue.remove();
// Tidy up!
Примечание: PhantomReference
имеет классы одноуровневые именованные SoftReference
и WeakReference
, которые также могут быть полезны. Связь между ними задокументирована в java.lang.ref package documentation.
Не используйте финализаторы для этой цели или любые другие, если вы можете избежать этого. Нет никакой гарантии, что метод finalize() будет называться сразу после сбора мусора или даже что он будет вообще вызван (см. Эффективный Java 2nd Ed, Item 7). Пакет java.lang.ref - это путь. – Leigh
Если вы можете помочь, не используйте финализаторы! http://stackoverflow.com/a/158791/74694 –