它们都可以用于清理,几乎无法保证,但 PR 需要更多的线束编码。那么,有两种选择,为什么我必须偏爱另一种呢?
Javadoc 9将 finalize 描述为非常有问题,但这并不能使其替代方案自动变得更好,对吧?
javadoc 还描述PhantomReference
为“在对象变得无法访问时提供更灵活和更有效的方法来释放资源”,但没有指定原因。好吧,我想这些家伙知道一些秘密,但我想知道 - 这个选择不能更明显吗?
区别
以下是我发现的 finalize (FZ) 和 pantom reference (PR) 之间的所有差异,如果我遗漏了什么,请纠正我。
可用于清理动作?
- 两者都是。
需要一个新线程来维护?
- PR:是的,您必须定义一个队列观察线程才能尽快进行清理
- FZ:没有
需要一个新的类来定义?
- PR:是的,您必须扩展
PhantomReference
才能有意义地采取行动 - FZ:没有
- PR:是的,您必须扩展
清理处理器可以访问引用对象吗?
- 公关:没有
- FZ:是的,这很方便
它在我的个人实践中可靠吗?
- 两者都是。
会导致性能问题、死锁和挂起吗?
- 两者都是。取决于你的代码,不是吗?
清理处理器中的错误会导致资源泄漏吗?
- 两者都是。取决于你的代码,不是吗?
如果不再需要可以取消吗?
- 公关:是的
- FZ:不,如果严格来说,直接
return
那么糟糕吗?
是否指定了多个实例之间的调用顺序?
- 公关:没有信息
- FZ:否 - “在调用以完成不同对象的方法时未指定排序”(java.lang.Object)
保证调用?
- PR:没有信息 - 您只能“请求通知对象可达性的变化”(java.lang.ref)
- FZ:否 - “如果有的话,只有在无限期延迟之后才能在可终结对象上调用 finalize 方法”(java.lang.Object)
关于时间的任何保证?
- PR:否-“在垃圾收集器确定引用对象的可达性已更改为与引用类型对应的值之后的一段时间”(java.lang.ref)
- FZ:否 - “Java 编程语言没有指定多久会调用终结器”(JLS),“如果有的话,只有在无限延迟之后才可能在可终结对象上调用终结方法”(java.lang.目的)
加工过程中可以
this
复活吗?- PR:不,这还不错
- FZ:是的,官方支持