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?
(我希望看到新值,这就是以这种方式编码的重点,但我想知道这是否是一个“安全”的赌注)