2013-12-17 50 views
0

當類中的語句正在執行時,會阻止對Foo及其靜態成員的所有訪問嗎?同步類對象會阻塞整個類(及其成員)

MyBlock: 
synchronize(Foo.class) 
{ 
    // ... do something 
} 

換句話說,而MyBlock正在執行,沒有其他線程將能夠調用任何靜態方法Foo,對不對?

好的,如果這不行。那麼,如何阻止課程及其成員被訪問一段時間? 謝謝

+2

沒有。這不是同步如何工作。基本上,你鎖定的對象本身並不相關。它只有在多個線程試圖對同一個對象進行鎖定時纔有意義。 – njzk2

+2

另外:你也可以試試這個。 – njzk2

+0

錯誤。它會阻止鎖定在同一個類對象上的所有執行路徑,沒有別的。有沒有這樣的事情,「阻止類」 –

回答

3

不可以。在這種情況下,鎖對象本身(Foo.class對象)的使用不受同步塊使用作爲鎖對象的影響。

你不能停止使用正在使用的類,除非你把它們放在類似於控制訪問的代理之類的東西之後,或者使方法本身有條件地在內部阻止執行,這並不能真正阻止訪問,而是模擬它。

+0

(剛更新我的問題)無關。 –

0

如果你想鎖定靜態成員,你可以定義一個虛擬靜態成員,以便你可以鎖定,並且每次你想訪問靜態成員時,你只要檢查該虛擬成員是否被鎖定。

class Foo{ 
    public static Integer dummyLock; 
.... 
} 

afterwhich您可以: MyBlock:

synchronize(Foo.dummyLock) 
{ 
    // ... access static members here 
}