public Foo getFoo(){
Foo foo = null;
synchronized(fooList){
if(fooList.size() > 0){
foo = fooList.remove(0);
}
}
return foo;
}
foo
は同期ブロックの外で宣言されているため、不正なデータを返す可能性はありますか?
public Foo getFoo(){
Foo foo = null;
synchronized(fooList){
if(fooList.size() > 0){
foo = fooList.remove(0);
}
}
return foo;
}
foo
は同期ブロックの外で宣言されているため、不正なデータを返す可能性はありますか?
呼び出している各スレッド インスタンスgetFoo()
には、独自のfoo
インスタンスがあります。したがってfoo
、スレッドセーフであり、同期は必要ありません。
このコンテキストでの「不良データ」とはどういう意味ですか? 対応する右中括弧のfooList
前後で非同期に変更される可能性があります(より一般的に言えば、戻り値が使用される瞬間まで)。最終的な目標は何ですか?synchronized(fooList)
return foo;
getFoo
Foo foo
はローカル変数であり、かつfooList
同期されているため、古いデータは返されません
単一のオブジェクトを共有するのではなく、各スレッド呼び出しが新しいFoo
オブジェクトを作成するため、ローカル変数はスレッド セーフです。複数のスレッドが にアクセスできるため、 variable はスレッド セーフではありませんfooList
が、この場合、fooList
は既に同期されています。