2013-09-24 39 views
1

我想将这个示例代码发生什么:Java垃圾收集允许死锁?

public class Start { 
    public static void main(String[] args) { 
     new Start().go(); 
    } 

    public Start() { 
     A a = new A(); 
     B b = new B(); 
     a.setB(b); 
     b.setA(a); 
    } 

    public boolean running = true; 

    public void go() { 
     while(running) { 
      try { 
       Thread.sleep(10); 
      } catch (Throwable t) {} 
     } 
    } 
} 

public class A { 
    B b; 
    public void setB(B b) { 
     this.b = b; 
    } 
} 

public class B { 
    A a; 
    public void setA(A a) { 
     this.a = a; 
    } 
} 

这显然是一个愚蠢的计划,但: 我逛到会发生什么,A和B的实例? 它们都是相互引用的,所以它们不应该被认为是可收集的。但事实上,它们对程序的其余部分是死的,因为它们将永远不会再被引用。

所以我的问题是他们会被垃圾收集?或者他们是死记硬背?

在此先感谢!

+2

当'Start'构造完成两个'了'和'B'掉出的范围。 – Bart

回答

6

一旦Start的构造函数结束,两个引用ab不能被任何“根”访问,因此它们有资格进行垃圾回收。根通常是调用堆栈或全局变量的变量。

一些垃圾收集器(例如那些使用reference counting的垃圾收集器)可能在循环引用时遇到困难,但现代GC可以处理这种类型的情况而没有问题。

+0

@Oak我澄清了。 – assylias