2013-09-24 65 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