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