是否有人有“长”弱引用(不短)的实际例子?
这仅供内部使用吗?
答案 0 :(得分:16)
与普遍看法相反,Finalize
不会导致对象被垃圾收集。相反,如果发现没有强大的有根引用,则注册的终结器将阻止对象立即被垃圾收集。相反,该对象将被添加到一个根深蒂固的对象列表中,这些对象的Finalize
方法应该在第一次运行时运行。当发生这种情况时,对象的所有短弱引用都将失效,但长弱引用不会。
如果一个人有两个或多个必须以特定顺序解构的对象,那么最后必须解构的对象可能有助于引用必须首先被解构的对象。这应该是某种形式的弱引用,因此前一个对象不会不必要地延长前一个对象的生命周期,但如果它是一个短的弱引用,它将在它需要之前变得不可用。使其成为一个长期的弱参考可以避免这个问题。
更一般地说,如果一个人只想知道某个对象是否处于可用状态,那么一个简短的弱引用是合适的,而一个长弱引用通常适用于需要知道的情况关于一个对象,无论其状态如何。作为另一个示例,假设远程数据库服务器一次只能与一个连接对象接口,并且连接对象具有终结器,该终结器通知远程服务器不需要其服务。如果放弃连接对象并尝试重新连接同一服务器,则连接管理器必须能够处理三种情况:
它有一个WeakReference
,它包含对早期连接对象的引用,它仍然很好。在这种情况下,代码应该只是开始使用它。
早期的连接对象的终结器已运行完成,远程服务器已准备好进行新连接。在这种情况下,代码应该只是创建一个新的连接对象。
GC注意到连接对象已被放弃,并已安排完成,但终结器尚未运行完成。在这种情况下,代码必须确保在建立新连接之前清除旧连接。
第一种情况可以通过短WeakReference
来处理。确定第二个或第三个适用需要很长WeakReference
。请注意,一旦连接入队以进行最终确定,连接管理器就不会对尝试重用它感兴趣,但仍然必须知道它的存在。