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が を取得したばかりで、実際には待機しているとします。objt_foo
同期ブロックが実行された後、その同期ブロックbarが実行され fooますよね? どのような値がobj表示されますか? 古いもの?それとも新しいセットbarですか?
(新しい値が見られることを願っています。それがそのようにコーディングすることの要点ですが、これが「安全な」賭けであるかどうか知りたいです)