【发布时间】:2013-11-18 05:29:54
【问题描述】:
我读到 JVM gc 在找到一个无法访问的对象后,运行该对象的 finalize() 方法。然后它检查对象是否仍然无法访问,如果不是,则将其删除。所以我写了一个finalize,让它的对象引用再次可用:
public class Stuff {
List<Object> list;
public Stuff(List<Object> list) {
this.list = list;
}
@Override
protected void finalize() throws Throwable {
list.add(this);
System.out.println("A Stuff is finalized");
}
}
主要方法如下:
public class Main {
public static void main(String[] args) {
List<Object> list = new ArrayList<>();
list.add(new Stuff(list));
list.remove(0);
System.gc();
System.out.println(list.get(0));
}
}
gc 运行,因为“A stuff is finalized”出现在标准输出上,但 main 中的打印行随后抛出 IndexOutOfBoundsException。我可以完成这项工作吗?
我通常根本不使用 finalize,我只是觉得看看 finalize 是否可以使其对象的引用再次可用会很有趣。我可以做这个吗?
【问题讨论】:
-
尝试在不看解决方案的情况下解决这个难题:wouter.coekaerts.be/2012/puzzle-chicken :)