/**
* 對象的自我拯救
* @author Administrator
*
*/
public class FinalizeEscapeGC {
public static FinalizeEscapeGC SAVE_HOOK=null;
//判斷是否還活著
public void isAlive(){
System.out.println("我還活著");
}
@Override
protected void finalize() throws Throwable {
super.finalize();
System.out.println("finalize方法执行了");
FinalizeEscapeGC.SAVE_HOOK=this;//与对象简历联系,自救
}
public static void main(String[] args) throws InterruptedException {
SAVE_HOOK=new FinalizeEscapeGC();
//第一次自救
SAVE_HOOK=null;
System.gc();
//因为finalize的优先级低,先等一下
Thread.sleep(500);
if(SAVE_HOOK!=null){
SAVE_HOOK.isAlive();
}else{
System.out.println("第一次自救失败");
}
//第二次自救
//因为每个对象的finalize()方法只会被系统自动调用一次,所以第一次调用后,
//第二次自救时不会再调用finalize(),自然也就不会与其他的对象产生联系,从而自救失败
SAVE_HOOK=null;
System.gc();
//因为finalize的优先级低,先等一下
Thread.sleep(500);
if(SAVE_HOOK!=null){
SAVE_HOOK.isAlive();
}else{
System.out.println("第二次自救失败");
}
}
//finalize()虽然能够实现对象自救,但是不要轻易使用,因为他的运行代价太大,不确定性高,无法确定各个对象的调用顺序。
//而且finalize()能做的事,try-finally都能做,而且做得更好
}
java对象在gc时的自救小demo
最新推荐文章于 2020-07-14 14:19:13 发布