有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

对象字段的java终结

我很难理解JavaSE8语言规范第12.6.1节和第12.6.2节的含义。我正在使用一种产品,其中Java对象管理本机对等点,因此正确地完成(直到我们有机会进行ref队列重写)非常重要

从规范来看,很明显,终结器可能会出现故障。这是可达性,我有一个困难的时间

我相信说明书上说:

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个断言。我将非常感谢您确认它们是真的,或者解释为什么一个或多个是假的


共 (1) 个答案

  1. # 1 楼答案

    如果A.finalize首先获取了锁,那么a.o.getClass()即使在C中也会NPE。最后的断言是错误的

    就可达性而言,可以这样想:假设AC是循环可达的,那么在“同一时间”将达到不可达性。因此,不能合理地说A必须在C之前完成

    我猜一个直接修复可能是^{的参考计数。然而,依靠GC清除非内存资源并不是件好事