Когда PhantomReference / SoftReference / WeakReference ставится в очередь, как вы узнаете, на что он ссылается? - PullRequest
2 голосов
/ 08 октября 2011

Я не использовал PhantomReferences.Кажется, очень мало хороших примеров использования в реальных условиях.

Когда фантом появляется в вашей очереди, как вы узнаете, какой это был объект?Метод get () кажется бесполезным.Согласно JavaDoc ,

Поскольку референт фантомной ссылки всегда недоступен, этот метод всегда возвращает нуль.

Я думаю, что есливаш объект - одноэлементный, вы всегда хотите использовать подкласс PhantomReference, в который вы помещаете любые необходимые вам сувениры, чтобы понять, что умерло.

Это правильно, или япропустить что-то?

Это также верно для SoftReferences?Для WeakReferences?

Ссылки на соответствующие примеры использования были бы хорошими.

Ответы [ 2 ]

1 голос
/ 10 октября 2011

Я думаю, что если ваш объект не является одноэлементным, вы всегда хотите использовать подкласс PhantomReference, в который вы помещаете все необходимые сувениры, чтобы понять, что умерло.

Вы также можете использовать Map<Reference<?>, SomeMetadataClassOrInterface> для восстановления любых метаданных, которые вам нужны. Поскольку ReferenceQueue<T> возвращает Reference<T>, вы должны либо привести его к тому подклассу PhantomReference, который вы ожидаете, либо позволить Map<> сделать это за вас.

Что бы это ни стоило, похоже, что использование PhantomReferences налагает на вас некоторое бремя:

В отличие от мягких и слабых ссылок, фантомные ссылки не очищаются сборщиком мусора автоматически, поскольку они ставятся в очередь. Объект, доступный через фантомные ссылки, будет оставаться таким до тех пор, пока все такие ссылки не будут очищены или сами по себе не станут недоступными.

так что вам придется clear() ссылки самостоятельно, чтобы память была восстановлена. (почему полезно делать это вместо того, чтобы позволить JVM сделать это для вас, мне не под силу)

1 голос
/ 08 октября 2011

Ваш вопрос побудил меня еще немного разобраться в этом, и я нашел это очень хорошо написанное объяснение и примеры всех типов ссылок.Он даже говорит о некотором (незначительном) использовании фантомных ссылок.

http://weblogs.java.net/blog/2006/05/04/understanding-weak-references

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...