Effective Java 2nd Edition Reading Notes Item7: Avoid Finalizers 不使用Finalizers。
Finalizers是不可预知的,有时是危险的,并且是不必要的。 在C++中,析构函数用于回收资源,而在Java中,通过GC来回收资源。析构函数还用于回收非内存资源,在Java中,通过try{}finally{}来完成同样的工作。
首先finalizers并不能保证被马上执行。在对象不可用开始到finalize方法执行之间的时间是任意的。这意味着不能在finalizers中进行具有时间要求的操作。例如在finalizer中关闭文件。[操作系统中可以打开的文件数是有限制的,一旦超过限制,将不能再打开文件。] 何时执行finalizers是GC的功能,因JVM的实现不同而不同。使用finalizers在极端的情况下会导致实例回收的延迟,从而发生OutOfMemoryError。规范没有定义finalizers什么时候执行,甚至不能确保finalizers是否会被执行。 永远不要依赖finalizers去实现持久性的更新。例如在finalizers中释放持久性的锁。 !--判断阅读权限-->!--判断是否已经扣点--> |
