private volatile Object obj = new MyObject();
void foo()
{
synchronized(obj)
{
obj.doWork();
}
}
void bar()
{
synchronized(obj)
{
obj.doWork();
obj = new MyObject(); // <<<< notice this line (call it line-x)
}
}
假設在某個時間點,線程t_bar
正在執行bar()
,另一個t_foo
正在執行foo
,而且t_bar
剛剛收購obj
,所以t_foo
是,實際上,等候。同步對非最終對象
執行bar
中的同步塊後,foo
將開始執行其同步塊,對吧?它會看到什麼值obj
?舊的?或者在bar
中設置新的?
(我會希望新值看出,這是編碼這種方式整點,但我想知道這是否是一個「安全」的賭注)
@javapirate:我發現它非常粗魯,你編輯我的帖子只是因爲你喜歡你自己的K&R格式風格?我很抱歉,但我必須重新格式化它。 – 2013-04-26 16:39:31
對不起。我想要擺脫很多空的空間。前進! – 2013-04-26 16:42:52
可能有助於理解的一個區別是* objects *或不是final或not-final,引用它們的變量是。鎖在對象上,而不在變量上。 – 2013-04-26 17:45:07