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