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