"终结者监护人"如何在java中工作?

Vin*_*C M 13 java garbage-collection finalizer

"终结者监护人"[Effective Java,第30页]如何运作?

你用过它们了吗?它解决了任何具体问题吗?

San*_*rma 18

它解决了子类忘记调用finalize超类方法的问题.此模式通过将一个额外的实例附加finalize到您的超类来实现.这样,如果超类超出范围,附加的实例也将超出范围,这将触发其执行finalize,而后者又将调用finalize封闭类.

这是一个简短的片段,展示了行动中的守护者模式:

public class Parent {

    public static void main(final String[] args) throws Exception {
        doIt();
        System.gc();
        Thread.sleep(5000); //  5 sec sleep
    }

    @SuppressWarnings("unused")
    private final Object guardian = new Object() {
        @Override protected void finalize() {
            doFinalize();
        }
    };

    private void doFinalize() {
        System.out.println("Finalize of class Parent");
    }

    public static void doIt() {
        Child c = new Child();
        System.out.println(c);
    }

}

class Child extends Parent {

    // Note, Child class does not call super.finalize() but the resources held by the
    // parent class will still get cleaned up, thanks to the guardian pattern
    @Override protected void finalize() {
        System.out.println("Finalize of class Child");
    }

}
Run Code Online (Sandbox Code Playgroud)

  • 但是当父类要进行GC时,父类将无法进行GC,因为匿名类持有对Parent类的引用,而Parent类也通过对匿名类的引用.实例字段链接.因此,由于这个循环引用,Parent和匿名类如何符合垃圾收集的条件? (2认同)
  • @Geek:Java有一个非常棒的GC,它不会被循环引用所触发.更多[这里](http://stackoverflow.com/questions/1910194) (2认同)