2012-05-19 57 views
0

我需要清除塊級同步的一些要點。塊級同步

假設以下的同步塊是在一個類的方法相同的方法

class A{ 

some_method(){ 

//BLOCK1 
synchronized(OBJ1){ 
shared code... 
} 

//BLOCK2 
synchronized(OBJ1){ 
shared code... 
} 

//BLOCK3 
synchronized(OBJ2){ 
shared code... 
} 
} 

} 

以下查詢:

1)這是正確的,如果一個線程進入由上OBJ1獲得鎖BLOCK1,那麼只要第一個線程在OBJ1上保持鎖定,其他線程就可以同時運行塊3,否則沒有其他線程可以進入塊2。

2)如果在完成block1之後進入block2,第一個線程是否需要再次獲得OBJ1的鎖定? 3)如果第一個線程在block2中調用一些代碼,從block1開始,那麼它將不得不釋放第一個block執行期間獲得的OBJ1上的鎖定,並再次獲取它,或者第一個block中獲得的同一個鎖定將會工作?

現在假定BLOCK1是在一類和blockk2的方法和圖3是在其它的類

4)相同的方法如點1保持爲同步真正是通過在一些獲得鎖發生第三類obj(OBJ1,OBJ2)?

+0

是這個家庭作業? – mata

+2

[Java教程:同步方法](http://docs.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html) – matthewnreid

回答

0
  1. 是的,這是正確的。
  2. 是的,因爲塊在OBJ1同步
  3. 我不明白你的意思。如果你問的是「可重入鎖?」,那麼是的。已經對對象鎖定的線程可以輸入同一對象上同步的另一個塊。
  4. 是的。代碼在哪裏並不重要。重要的是線程是否鎖定。
0

1)是的,如果一個線程持有OBJ1鎖定,則沒有其他線程可以獲取同樣的鎖

2)是的,把鎖需要,因爲它會一直在年底發佈再次被收購塊的1

3)否,一個線程不會上的鎖塊,它已持有

4)是

0

1)YES
2)是,因爲我t在BLOCK1之外。

3)對於嵌套鎖定,同樣的鎖保持(即已經獲得),就像這一個一樣。

現在假定BLOCK1是在一類和blockk2的方法和圖3是在其它的類
>>答的方法,包括:作爲鎖定對象是相同的結果將不會遠不同對象在內存中。

4)是