避免使用 Finalizer 和 Cleaner 机制

Finalizer 机制是不可预知的,往往是危险的,而且通常是不必要的。 它们的使用会导致不稳定的行 为,糟糕的性能和移植性问题。 Finalizer 机制有一些特殊的用途,我们稍后会在这个条目中介绍,但是 通常应该避免它们。 从 Java 9 开始,Finalizer 机制已被弃用,但仍被 Java 类库所使用。 Java 9 中 Cleaner 机制代替了 Finalizer 机制。 Cleaner 机制不如 Finalizer 机制那样危险,但仍然是不可预测,运行 缓慢并且通常是不必要的

如何为对象封装需要结束的资源(如文件或线程),而不是为该类编写 Finalizer 和 Cleaner 机制?让你的类实现 AutoCloseable 接口即可,并要求客户在在不再需要时调用 每个实例 close 方法,通常使用 try-with-resources 确保终止,即使面对有异常抛出情况(详见第 9 条)。一个值得一提的细节是实例必须跟踪是否已经关闭:close 方法必须记录在对象里不再有效的属 性,其他方法必须检查该属性,如果在对象关闭后调用它们,则抛出 IllegalStateException 异 常。

第二种合理使用 Cleaner 机制的方法与本地对等类(native peers)有关。本地对等类是一个由普通 对象委托的本地 (非 Java) 对象。由于本地对等类不是普通的 Java 对象,所以垃圾收集器并不知道它, 当它的 Java 对等对象被回收时,本地对等类也不会回收。假设性能是可以接受的,并且本地对等类没 有关键的资源,那么 Finalizer 和 Cleaner 机制可能是这项任务的合适的工具。但如果性能是不可接受 的,或者本地对等类持有必须迅速回收的资源,那么类应该有一个 close 方法,正如前面所述。

猜你喜欢

转载自www.cnblogs.com/lIllIll/p/12563644.html