简述
与finalize(终结)方法类似,都是对资源的释放。那为什么这里讲述cleaner呢,因为终结方法存在严重的安全当构造对象途中出现异常,本应该被回收,可是finalizer attack会将该对象的引用记录存在一个静态域,阻止该对象被回收,且在后期调用该对象的方法。
用处
当忘记释放资源的时候,可以作为最后的安全网来释放资源。
案例分析
public class Room implements AutoCloseable{
private static class State implements Runnable{
int numJunkPiles ;
State(int numJunkPiles){
this.numJunkPiles = numJunkPiles;
}
@Override
public void run() {
System.out.println("Cleaning room");
numJunkPiles = 0;
}
}
private final State state ;
private final Cleaner cleaner ;
public Room(int numJunkPiles){
state = new State(numJunkPiles);
cleaner = Cleaner.create(this,state);
}
@Override
public void close() throws Exception {
cleaner.clean();
}
public static void main(String[] args) throws Exception {
try(Room room = new Room(11) ){
System.out.println("Peace out");
}
}
}
这段代码中,首先Room在try-catch-resource中初始化,在初始化时,创建了清除器。接着try-catch-resource会调用close()方法去执行clean()操作,其中clean源码如下图