當類中的語句正在執行時,會阻止對Foo
及其靜態成員的所有訪問嗎?同步類對象會阻塞整個類(及其成員)
MyBlock:
synchronize(Foo.class)
{
// ... do something
}
換句話說,而MyBlock
正在執行,沒有其他線程將能夠調用任何靜態方法Foo
,對不對?
好的,如果這不行。那麼,如何阻止課程及其成員被訪問一段時間? 謝謝
當類中的語句正在執行時,會阻止對Foo
及其靜態成員的所有訪問嗎?同步類對象會阻塞整個類(及其成員)
MyBlock:
synchronize(Foo.class)
{
// ... do something
}
換句話說,而MyBlock
正在執行,沒有其他線程將能夠調用任何靜態方法Foo
,對不對?
好的,如果這不行。那麼,如何阻止課程及其成員被訪問一段時間? 謝謝
不可以。在這種情況下,鎖對象本身(Foo.class
對象)的使用不受同步塊使用作爲鎖對象的影響。
你不能停止使用正在使用的類,除非你把它們放在類似於控制訪問的代理之類的東西之後,或者使方法本身有條件地在內部阻止執行,這並不能真正阻止訪問,而是模擬它。
(剛更新我的問題)無關。 –
如果你想鎖定靜態成員,你可以定義一個虛擬靜態成員,以便你可以鎖定,並且每次你想訪問靜態成員時,你只要檢查該虛擬成員是否被鎖定。
class Foo{
public static Integer dummyLock;
....
}
afterwhich您可以: MyBlock:
synchronize(Foo.dummyLock)
{
// ... access static members here
}
沒有。這不是同步如何工作。基本上,你鎖定的對象本身並不相關。它只有在多個線程試圖對同一個對象進行鎖定時纔有意義。 – njzk2
另外:你也可以試試這個。 – njzk2
錯誤。它會阻止鎖定在同一個類對象上的所有執行路徑,沒有別的。有沒有這樣的事情,「阻止類」 –