如何解决对象字段的完成
我很难理解 Java SE 8 语言规范第 12.6.1 和 12.6.2 节的含义。我正在使用 Java 对象管理本机对等点的产品,因此正确完成最终确定(直到我们有机会进行 ref-queue 重写)很重要。
很明显,从规范中可以看出,终结器可能会出现故障。这是可达性,我很难过。
我相信规范是这样说的:
class A {
public Object o = new Object()
protected synchronized void finalize() throws Throwable { o = null; }
}
class B {
A a = new A()
protected void finalize() throws Throwable {
a.getClass() // always works: a cannot be null.
a.o.getClass() // might NPE: a's finalizer might have been run
}
}
class C {
A a = new A()
protected void finalize() throws Throwable {
synchronized (a) {
a.getClass() // always works: a cannot be null.
a.o.getClass() // always works: a.o cannot be null.
}
}
}
上面有 4 个断言。我非常感谢确认它们是真实的,或者解释为什么一个或多个是错误的。
解决方法
如果A.finalize
先获取锁,那么即使在a.o.getClass()
中C
也会NPE。最后的断言是错误的。
就可达性而言,可以这样想:假设 A
和 C
是循环可达的,那么它们将在“同时”达到不可达性。因此,A
必须在 C
之前完成是不合理的。
我猜直接修复可能是A
的引用计数。但是,依靠 GC 来清理非内存资源不会很好。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。