以下方法是SomeType
類的方法 - 它用作其參數的類型。 行註釋表示行#s。方法調用和同步塊之間的「間隙」 - 避免併發中的死鎖
synchronized void someMethod(SomeType other) { // line 1
// line 2
synchronized (other) { // line 3
//...do stuff // line 4
}
}
塊表示爲「線4」具有的兩個this
和other
一些其他同步方法調用,並且該代碼是用於避免死鎖。
但是 - 假設同時調用a.someMethod(b)
和b.someMethod(a)
,其中a
和b
是不同的實例。
進一步假設b.someMethod(a)
被調用後立即a.someMethod(b)
是,他們都在行2--每個a
和b
獲得自己的鎖,並等待對方的鎖進行舉起 。
這可能發生嗎?
如果是這樣 - 在哪個jdk實現?這看起來像取決於具體實現的東西,除非它明確地在jdk規範中。
TIA
但'b'可以在*'a'進入第3行的塊之前進入'someMethod()'*。每個線程都擁有頂級監視器並且處於死鎖狀態。 – chrylis 2015-04-05 20:54:22
當然,看起來像是一個僵局。我見過的常用方法是始終以明確的順序獲取互斥鎖。 – chrylis 2015-04-05 20:54:57
@chrylis好的,我的錯。 – 2015-04-05 20:56:03