Effective Java 学习札记第6条 - 避免使用终结函数
Effective Java 学习笔记第6条 --- 避免使用终结函数
终结函数(finalizer)可以用来回收不可到达的对象,就是说对象的生命周期结束后,可以用终结函数来回收为该对象分配的资源。
但是,终结函数执行线程的优先级很低,以至于我们不敢把对时间要求比较高的对象回收让终结函数来回收。JVM总是会延迟终结函数的执行。
对于急需回收对象,可以使用tyr finally,在finally写回收对象的代码,这样就保证对象能及时被回收。
// try-finally block guarantees execution of termination method Foo foo = new Foo(...); try { // Do what must be done with foo ... } finally { foo.terminate(); // Explicit termination method }
终结函数其实也是有用的。第一种情况是当作安全网,当忘了对对象显示回收的时候,用终结函数作为最后的安全屏障。第二种情况是:普通对象通过一个本地方法 委托给本地对象叫本地对等体。本地对等体不是普通对象,所以当委托给他的对象被回收的时候本地对等体并不会被回收,所以这时候终结函数就派上用场了。
最后要注意的是,当子类改写覆盖了超类的终结函数时候,如果不显示调用超类的终结函数,那么超类的终结函数将不会被执行。
// Manual finalizer chaining protected void finalize() throws Throwable { try { // Finalize subclass state ... } finally { super.finalize(); } }
总结:尽量不使用终结函数,除非作为安全网或者是用来回收不关键的本地资源。