2012-04-11 37 views
1

就會死鎖發生在這些Java情況
1-會在這些情況下發生死鎖嗎?

synchronized(obj) { 
    obj.syncMethod(); // the method signature: public synchronized void syncMethod() {...} 
} 

2-

synchronized(obj) { 
    if (condition) 
    throw new Exception(); // deadlock because obj lock is not released? 
    // do other stuff 
} 

謝謝。

+0

我沒有使用同步方法的經驗,但看起來很愚蠢,因爲拋出異常並且方法的執行因此異常終止而發生死鎖。而且,如果是這種情況,您可以在那裏捕捉任何異常,解鎖對象並拋出新的異常。 – MarioDS 2012-04-11 23:01:03

+0

你爲什麼不測試你的代碼並找出答案? – 2012-04-12 00:54:54

回答

1
  1. 沒有僵局會發生 - Java的鎖是折返,也就是說,當一個線程持有的鎖(在你的情況就OBJ),它可以進入需要相同的鎖synchronized塊沒有問題(一個synchronized方法在這個同步,這也是你的情況obj)。
  2. 無論是否有異常導致線程退出,鎖定都將在釋放同步塊時釋放。
+0

爲什麼在使用j.u.c.Locks時,最好的做法是在try/finally塊中執行鎖定/解鎖操作 - 以確保始終執行解鎖操作。內部同步(又名syncronized)默認情況下提供此功能 - 但具有其他限制 – 2012-04-20 11:15:28

0

如果不捕獲該異常在​​塊,那麼你的鎖將被釋放,並不會發生死鎖。有關詳細信息,請參閱here

相關問題