2012-05-15 79 views
1

在Java SE 7 Tutorial的Deadlock部分中,有一個示例,如下所示。我不明白爲什麼主要方法可以創建2 STATIC嵌套對象(實際上它被定義爲靜態嵌套類)。據說沒有任何靜態類的實例,對吧?誰能幫我嗎?謝謝。我可以創建多個STATIC嵌套對象嗎?

============================================== ============================================= Alphonse和Gaston是朋友,和偉大的信徒禮節。嚴格的禮貌規則是,當你向朋友鞠躬時,你必須保持鞠躬,直到你的朋友有機會歸還弓。不幸的是,這條規則沒有考慮到兩個朋友可能同時向對方低頭的可能性。這個示例應用程序,死鎖,模型這種可能性:

public class Deadlock { 
    static class Friend { 
     private final String name; 
     public Friend(String name) { 
      this.name = name; 
     } 
     public String getName() { 
      return this.name; 
     } 
     public synchronized void bow(Friend bower) { 
      System.out.format("%s: %s" 
       + " has bowed to me!%n", 
       this.name, bower.getName()); 
      bower.bowBack(this); 
     } 
     public synchronized void bowBack(Friend bower) { 
      System.out.format("%s: %s" 
       + " has bowed back to me!%n", 
       this.name, bower.getName()); 
     } 
    } 

    public static void main(String[] args) { 
     final Friend alphonse = 
      new Friend("Alphonse"); 
     final Friend gaston = 
      new Friend("Gaston"); 
     new Thread(new Runnable() { 
      public void run() { alphonse.bow(gaston); } 
     }).start(); 
     new Thread(new Runnable() { 
      public void run() { gaston.bow(alphonse); } 
     }).start(); 
    } 
} 

死鎖時運行,這是非常有可能的是,當他們嘗試調用bowBack兩個線程將被阻塞。這兩個塊都不會結束,因爲每個線程都在等待另一個線程退出低頭。

回答

1

從Java教程實例:實際上,靜態嵌套類是行爲上已經是一個頂級類爲了方便打包,嵌套在另一個頂級類中。

您可以從Deadlock中刪除Friend,並將其作爲外部類而不會改變行爲。

「靜態」是指訪問外部類中的變量和方法。與靜態(類)方法類似,靜態嵌套類不能直接引用其封閉類中定義的實例變量或方法 - 它只能通過對象引用來使用它們。

我不認爲它說任何地方「沒有任何靜態類的實例」。外部類不能是靜態的,嵌套類實際上是外部類。

不錯的問題,但我最近經歷了這個例子,並沒有考慮到這一點。

+0

很好的解釋。非常感謝。 – icepeanuts

0

編輯:即使創建一個線程比調用方法慢得多,第一次加載它們需要更長的時間。

由於代碼是死鎖,因爲加載方法所需的時間將兩個線程有​​效地對齊,因爲在加載之前方法不能被調用。

如果在線程啓動之間添加以下行,則不會發生死鎖。

Thread.sleep(50); 

同樣,如果你調用的方法創建線程,以確保這些方法之前加載,也可作爲定時現在依賴於線程的起點你沒有得到一個僵局。

alphonse.bow(gaston); 

Prevous答案。

恕我直言,這是非常不可能的,你會得到一個僵局。

如果您反覆執行這些任務,最終會導致死鎖。你只在不同的時間執行一次這些操作。這是因爲開始一個新線程需要比獲得兩個鎖之間的時間多得多的時間。 (100倍或更多差異。)

我認爲這可能會在百次運行中出現一次死鎖,但可能更少。

據說沒有任何靜態類的實例,對吧?

不知道這意味着什麼,因爲是Friend兩個實例不存在Deadlock

+0

我每次都會死鎖。線程[2]獲取對gaston的內部鎖定。所以當線索[1]的阿爾方斯試圖獲得加斯頓的鎖定時,他不能這樣做,反之亦然。 – Sridhar

+0

深入解答!謝謝。 – icepeanuts

+0

@RajChola好的一點,我糾正了我對這個例子的答案。 –

相關問題