为什么啊?(垃圾回收对象重生时出的问题)
?
class C {
static A a;
}
?
class A {
public void live(){
System.out.println("alive");
}
@Override
public void finalize() {
System.out.println("A finalize");
C.a = this;
}
}
?
public class Test {
public static void main(String[] args) throws InterruptedException {
A a = new A();
a = null;
C.a=null;
System.gc();
Thread.sleep(5000);
C.a.live();
}
}
?
没报错,a重生了
?
?
代码改成如下:
?
A a = new A();
a = null;
System.gc();
Thread.sleep(5000);
C.a=null; ? ? ? ? ? ? ? ? ? ?//只有这改了
C.a.live();
报错,空指针异常
?
___________________________________
?
明白了,
?
C.a=null;
System.gc();
?
连的太紧了,无论这两句哪句先哪句后,gc线程的启动都没能执行。所以C.a=null一定先于finalize中的 C.a=this,所以C.a重生了
?
?