长弱引用的实际例子有哪些?

18

请问有人有“长”弱引用的实际示例吗?(不是短的)

这只用于内部使用吗?

1个回答

18
与常见看法不同,Finalize 不会导致对象被垃圾回收。相反,如果发现该对象没有强引用,则注册的 finalizer 会阻止对象被立即垃圾回收。然而,该对象将被添加到一个强根对象列表中,该列表的对象应在第一次机会运行其 Finalize 方法。当这种情况发生时,所有短弱引用至该对象的引用都将失效,但长弱引用不会失效。
如果必须按特定顺序拆解两个或多个对象,则最后一个必须拆解的对象应引用必须首先拆解的对象。这应该是某种形式的弱引用,以便后者对象(必须在它之前被拆解的对象)不会无端地延长前者对象(将在之后被拆解的对象)的生命周期。如果它是短弱引用,它将在需要它之前变得无用。将其设置为长弱引用可以避免这个问题。
有时候,短弱引用适用于只想在对象可用状态下知道该对象的情况,而长弱引用通常适用于需要无论对象状态如何都要了解该对象的情况。举个例子,假设远程数据库服务器一次只能与一个连接对象进行接口交互,并且连接对象具有终结器,通知远程服务器其服务不再需要。如果连接对象被放弃并尝试重新连接同一服务器,则连接管理器必须能够处理三种情况:
- 它具有保存早期连接对象的WeakReference,而且它仍然有效。在这种情况下,代码应该简单地开始使用它。 - 早期连接对象的终结器已经运行完成,远程服务器已经准备好新连接。在这种情况下,代码应该简单地创建一个新连接对象。 - GC已经注意到连接对象被放弃,并将其安排为终结器,但终结器尚未运行完成。在这种情况下,代码必须确保在建立新连接之前清理旧连接。
第一种情况可以通过短的WeakReference处理。确定第二或第三种情况需要长时间的WeakReference。请注意,一旦连接被排队进行最终处理,连接管理器将不再有兴趣尝试重用它,但仍必须知道其存在。

非常感谢。回答很棒。它也回答了我在本周初提出的另一个问题。我在 Stack Overflow 上问了几个问题,但这个答案是我收到的最好的或最好的之一。非常非常感谢。 - Eric Ouellet
1
在您的假设连接管理器场景中,我如何从长弱引用中判断对象是否已计划进行终结(即如何将情况#1与情况#3区分开来)?我只会有一个具有非空目标的WeakReference对象,但我如何知道它处于什么状态? - Mike Marynowski
3
一种方法是使用两个弱引用,一个长引用和一个短引用。如果短引用已经失效但长引用仍然有效,则对象已经被安排为运行其终结器。 - supercat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接