从 soft/weak 引用中恢复硬引用

Recovering hard refs from soft/weak references

在我的程序中,可能会出现对象仅在弱引用上可用的情况。我注意到一些 NullPointerExceptions,它们不容易调试。我想知道,一旦对象被标记为弱可达,当用户线程执行其方法或通过硬引用到达时,是否有可能再次变得通常很难。互联网上的各种论坛都说我们可以恢复硬引用,给定 soft/weak 但我想知道为什么 SPEC is so specific then

Reachability

Going from strongest to weakest, the different levels of reachability reflect the life cycle of an object. They are operationally defined as follows: An object is strongly reachable if ... An object is softly reachable if ... An object is weakly reachable ...

我不应该把 lifecycle 理解为单向瀑布模型吗?一个对象在weakRefQueue中弱一段时间后被回收是否可以多次出现在WeakRefQueue中?当 ID 请求对象时,我使用弱引用来恢复硬引用,但还将它们放入引用队列以确定该对象是否仍在被客户端使用,如果没有,则进行一些清理。这一切都是在一个线程中完成的,但我问自己这是否会产生任何问题。

如果可以通过强引用访问某个对象,则该对象被强引用。没有比这更神奇的了。这意味着一个对象可以有多个强引用、多个软引用和多个弱引用,或者任何组合。

唯一的区别是通过 WeakReference 的引用不算作强引用。如果引用仍然可用,您可以像这样从弱引用中获得强引用。

WeakReference<MyType> ref = ...
MyType stringRef = ref.get();

所有这一切只是复制引用,不需要发生任何其他事情。