2011-12-19 61 views
1

我有兩種方法。在另一個同步方法中引用同步方法

他們都是同步方法。如果我從另一個方法調用一個方法,那會是一個死鎖情況嗎?

+1

這兩種方法是同一類的一部分嗎? – unholysampler 2011-12-19 13:09:48

+0

這取決於鎖對象。你能給出更多關於你的意思的細節,例如實例方法,靜態方法,帶有內部同步塊的方法嗎? – Thomas 2011-12-19 13:10:51

回答

4

不,假設兩種方法都在相同的類別(並且都是static或兩者都不是static)。 A​​方法只有在嘗試進入的線程可以獲得監視器對象的暫存(例如this)時纔會進入。由於線程已經獲得了顯示器,它可以簡單地輸入第二種方法,而不會有任何麻煩。

+0

這就是所謂的可重入鎖。 – toto2 2012-01-16 13:32:36

0

如果thread 1獲取了鎖A並且還想鎖定BThread 2B上鎖定,並且想要在A上鎖定。 這是一個僵局。 否則,一切皆有可能。

0

這取決於:

  • 如果這些被同步在兩個(或更多)不同的對象,
  • 如果多個線程訪問這些對象,
  • 並且如果這些對象的鎖順序可以變化的方法(在一個案例object1-> object2和其他案例object2-> object1)

然後是的,你可以得到死鎖。

但是,如果你正在同一個對象上談論同步方法,那麼就不可能發生死鎖:一個對象的監視器是可重入的:如果你已經持有它,你可以再次請求監視器(在同一個對象上輸入一個同步塊)。