[英]Can I create more than one STATIC nested objects?
在Java SE 7教程的“死鎖”部分中,有一個示例,如下所示。 我不明白為什么main方法可以創建2個STATIC嵌套對象(實際上它被定義為靜態嵌套類)。 據說沒有任何靜態類的實例,對嗎? 誰能幫我嗎? 謝謝。
================================================== ======================================== Alphonse和Gaston是朋友,也是偉大的信徒禮貌地。 嚴格的禮節規則是當您向朋友鞠躬時,必須保持鞠躬,直到朋友有機會歸還弓箭為止。 不幸的是,該規則不能解決兩個朋友可能同時鞠躬的可能性。 該示例應用程序Deadlock對這種可能性進行了建模:
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時阻塞。 兩個塊都不會結束,因為每個線程都在等待另一個退出弓。
從Java教程中:實際上,靜態嵌套類在行為上是頂級類,為了包裝方便,該頂級類已嵌套在另一個頂級類中。
您可以從死鎖內部刪除Friend,並將其作為外部類,而無需更改行為。
“靜態”是指訪問外部類中的變量和方法。 與靜態(類)方法一樣,靜態嵌套類不能直接引用其封閉類中定義的實例變量或方法,它只能通過對象引用來使用它們。
我不認為它在任何地方都說“沒有任何靜態類的實例”。 外部類不能是靜態的,而嵌套類實際上是外部類。
不過,這是一個好問題-我最近瀏覽了這個示例,沒有考慮這個問題。
編輯:盡管創建線程比調用方法要慢得多,但第一次加載它們所花費的時間甚至更長。
就像代碼一樣,這確實會造成死鎖,因為加載方法所需的時間有效地使兩個線程對齊,因為在加載方法之前無法調用方法。
如果在線程啟動之間添加以下行,則不會出現死鎖。
Thread.sleep(50);
同樣,如果在創建線程之前調用方法以確保方法已加載,則也不會出現死鎖,因為時間現在取決於線程的啟動。
alphonse.bow(gaston);
前一個答案。
恕我直言,極不可能出現僵局。
如果您重復執行這些任務,它們最終將陷入僵局。 您僅在不同時間執行一次這些操作。 這是因為啟動新線程所花費的時間比獲得兩個鎖之間的時間要多得多。 (相差100倍或更多。)
我希望這可能會在每100次運行中陷入一次僵局,但可能會更少。
據說沒有任何靜態類的實例,對嗎?
不知道那意味着什么,因為有兩個Friend
實例沒有Deadlock
實例
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.