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重生了