2014-10-29 225 views
6

我正在刷我的Java在練習​​中被問到這個問題。以下情況如何導致僵局?這怎麼會導致死鎖?

private Object sync = new Object(); 

    public void methodA() throws InterruptedException { 
     synchronized(this.sync) { 
      Thread.sleep(1000); 
     } 
    } 

    public void methodB() throws InterruptedException { 
     synchronized(this.sync) { 
      this.methodA(); 
     } 
    } 

我的猜測是,如果調用的methodB當了methodA它Thread.sleep代碼函數去,這兩個方法將啓動級聯,並導致不確定的睡眠?

想法?

回答

9

不,這不會造成死鎖。

要創建僵局,需要兩個Thread小號ab,兩種資源xy。如果ax持有鎖定,並且還需要對y鎖定,但by持有鎖定,並且還需要鎖定x,則發生死鎖。

您只有一件事在這裏鎖定,this.sync,所以沒有發生死鎖。

如果在另一個線程調用methodA時進入methodB,那麼它將等待,直到methodA釋放鎖再繼續。如果在另一個線程調用methodB時輸入methodA,則它將等待,直到methodB釋放鎖再繼續。請注意,methodB調用methodA並不重要,因爲它與this.sync上的鎖相同。

+0

感謝您的答案。我開始更好地理解這一點。不過,我確實有另一個問題,但我不想繼續發佈任何東西到SO。你可以直接到達嗎?非常感謝幫忙。 – matcartmill 2014-10-30 23:28:59

6

沒有僵局,它被稱爲Reentrant Synchronization,如果線程已獲得鎖它不會阻止自己,

想象的那樣,你把自己鎖在一個房間裏,現在你是房間內免費和其他房間鎖定,你有鑰匙或解鎖,並從該房間的門,其他人(線程)想要使用該房間(方法)被阻止,不是你