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
ですか?
(新しい値が見られることを願っています。それがそのようにコーディングすることの要点ですが、これが「安全な」賭けであるかどうか知りたいです)