当PhantomReference / SoftReference / WeakReference排队时,你怎么知道它所指的是什么?

时间:2011-10-08 01:45:01

标签: java weak-references soft-references phantom-reference

我没有使用PhantomReferences。似乎很少有真实世界使用的好例子。

当你的队列中出现一个幻像时,你怎么知道它是哪个对象? get()方法似乎没用。根据{{​​3}},

  

因为幻象参照的指示对象总是无法访问,   此方法始终返回null。

我认为除非您的对象是单身,否则您总是希望使用PhantomReference的子类,在其中放置您需要的任何纪念品以了解死亡的内容。

这是正确的,还是我错过了什么?

SoftReferences也是如此吗? For WeakReferences?

相关使用示例的链接会很棒。

2 个答案:

答案 0 :(得分:1)

你的问题让我对它进行了一些调查,我发现了这个非常好的书面解释和所有参考类型的例子。他甚至谈到幻像参考的一些(微弱)用法。

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

答案 1 :(得分:1)

  

我认为除非您的对象是单身,否则您总是希望使用PhantomReference的子类,在其中放置您需要的任何纪念品以了解死亡的内容。

您还可以使用Map<Reference<?>, SomeMetadataClassOrInterface>来恢复所需的元数据。由于ReferenceQueue<T>会返回Reference<T>,您必须将其强制转换为您期望的PhantomReference的任何子类,或让Map<>为您执行此操作。

对于它的价值,看起来使用PhantomReferences会给你带来一些负担:

  

与软引用和弱引用不同,垃圾收集器在排队时不会自动清除幻像引用。通过幻像引用可访问的对象将保持不变,直到所有此类引用都被清除或自身无法访问。

因此您必须自己clear()引用,以便回收内存。 (为什么必须这样做才有用,而让JVM为你做这件事超出我的意义)