2013-05-04 95 views
1

如果我調用一個同步的對象,我可以訪問該對象內的對象,就好像它們是同步的嗎?或者我只能訪問數據類型?同步會影響對象成員嗎?

+3

你的問題非常模糊 - 你說的「調用同步對象」是什麼意思?如果你想給出一個特定的代碼示例,這真的很有幫助。 – 2013-05-04 07:37:53

回答

0

可能,但只有小心。如果您始終鎖定同一個對象,則可以執行此操作。

很有可能你必須鎖定每個對象。

1

儘管您的目標是保護數據,但同步提供了圍繞代碼塊的獨佔性,而不是一塊數據。代碼在同步塊之外(或者在使用不同對象的塊中),可能會改變您嘗試保護的數據,即使這不是您想要的。

任何正確的鎖定策略都必須確保可能相互干擾的代碼塊保持相同的鎖定。這包括可能會干擾在另一個線程中運行的另一個副本的代碼。

synchronized (myObject) { 
    // sensitive code 
} 

在方法級鎖定只是用於鎖定this指針的方法的主體中的簡寫。 (或靜態方法的class對象)。

0

對每個對象的synchronize的能力在Java中是一個常見的煩惱,因爲它很混亂。

基本上,它意味着每個對象都可以是一個鎖。而已。因此,當您鎖定父對象時,對象的成員沒有特殊效果,並且將哪個特定對象用作鎖。如果所有線程都鎖定在同一個對象上,則只有其中一個線程將運行/訪問同步塊中的任何代碼。如果其中一些不這樣做,那麼就沒有這種保證。

如果要確保在任何給定時間只有一個線程正在訪問成員,請確保訪問該成員的所有線程在訪問同一對象之前都鎖定(或「同步」)。只要你這樣做,鎖使用哪個對象並不重要。