finalize和clean

弊端

1.执行的时间不确定,资源释放不能靠这2个方法。Cleaner规范指出:“清除方法在System.exit期间的行为是与实现相关的。不确保清除动作是否会被调用。”

2#.如果忽略在终结过程中被抛出来的未背捕获的异常,该对象的终结过程也会终止。正常情况下,未被捕获的异常会使线程终止,并打印出栈轨迹,但是。如果异常发生在终结方法中,则不会如此,甚至连警告都不会打印出来。清除方法没有这个问题,因为使用清除方法的一个类库在控制它的线程

3#.finalizer attack:如果从构造器或者它的序列化对等体(readObject和readResolve方法)抛出异常,恶意子类的终结方法就可以在构造了一部分的应该已经半途夭折的对象上运行。

这个终结方法会将该对象的引用记录在一个静态域中,阻止它被垃圾回收。非final类受到终结方法攻击,要编写一个空的final的finalize方法。

关闭资源

让类实现AutoCloseable,并要求其客户端在每个实例不再需要的时候调用close方法,一般是利用try-with-resources确保终止,即使遇到异常也是如此。值得提倡的一个细节是,

该实例必须记录下自己是否已经被关闭了:clone方法必须在一个私有域中记录下“该对象已经不再有效”。如果这些方法是在对象已经终止之后被调用。其他的方法就必须检查这个域,并抛出IllegalStateException异常

好处

1.安全网,在客户端无法正常结束操作的情况下,迟一点释放资源总比永远不释放要好。FileInputStream,FileOutputStream,ThreadPoolExecutor,java.sql.Connection

2.本地对等体

转载于:https://www.cnblogs.com/lccsblog/p/10992828.html

你可能感兴趣的:(finalize和clean)