`
schumee
  • 浏览: 24610 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

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();
		}
	}

 

      总结:尽量不使用终结函数,除非作为安全网或者是用来回收不关键的本地资源。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics