2012-04-19 113 views
2

我對這件事很好奇。我在一個同步塊中有一些代碼,它調用一個SDK方法,但它掛起。爲什麼我的代碼掛起?

synchronized(someObject) { 
    someSDKobj.someMethd(); 
} 

如果我從一個非同步塊中進行相同的調用,它會正確執行。

//synchronized(someObject) 
{ 
    someSDKobj.someMethd(); 
} 

原因之一掛是如果SDK方法進行呼叫時,在不同的線程,到在同一「someObject」同步的另一種方法,但事實並非如此。

還有什麼可以導致這種奇怪的現象?爲什麼被調用的方法會受到來自同步塊的調用的影響?如果它很重要,這是在Java-ME上運行。

+0

請詳細說明您打電話的方法,根本沒有足夠的信息,可能是死鎖或其他問題。 – 2012-04-19 09:13:02

+4

你看到它掛在哪裏嗎?你確定它甚至進入了同步塊嗎?當您不提供可編譯的代碼時,您正在讓社區對所有這些問題感到驚歎。 – 2012-04-19 09:14:22

+0

你確定你需要在你調用該方法的同一個對象上進行同步嗎?它是什麼SDK方法?其他代碼使用該對象? – 2012-04-19 11:55:48

回答

3

它因爲創建了一個稱爲「死鎖」的條件而掛起。問題是一個同步方法當時只能被一個線程訪問。因此,您的方法正在訪問此同步方法,並調用另一個線程來訪問被鎖定的相同方法。所以,第二個線程正在等待該函數被其他線程釋放,並且這從來就不會發生。

+1

它可能是一個死鎖,或者它可能是過程是僅僅因爲另一個原因而懸掛,並且永遠不會返回 – 2012-04-19 09:15:48

+0

你正在解釋這個人明顯知道的東西。 – 2012-04-19 09:17:02

+1

關於死鎖概念的更多細節,請看用餐哲學家問題。 – 2012-04-19 09:17:37

0

掛起時獲取線程轉儲。這應該可以確切地告訴你JVM的每個線程中發生了什麼,包括指出任何鎖爭用。