【发布时间】:2013-04-20 21:48:27
【问题描述】:
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 格式样式,这非常粗鲁?很抱歉,我必须重新格式化它。
-
对不起。我想摆脱很多空白。来吧!
-
一个可能有助于理解的区别是 objects 或非最终或非最终的,持有对它们的引用的变量是。锁在对象上,而不是在变量上。
-
@MiserableVariable 我明白,但感谢您的澄清!
标签: java synchronize