0
public Foo getFoo(){
    Foo foo = null;

    synchronized(fooList){
        if(fooList.size() > 0){
            foo = fooList.remove(0);
        }
    }

    return foo;
}

fooは同期ブロックの外で宣言されているため、不正なデータを返す可能性はありますか?

4

3 に答える 3

4

呼び出している各スレッド インスタンスgetFoo()には、独自のfooインスタンスがあります。したがってfoo、スレッドセーフであり、同期は必要ありません。

于 2012-04-19T15:25:18.210 に答える
1

このコンテキストでの「不良データ」とはどういう意味ですか? 対応する右中括弧のfooList前後で非同期に変更される可能性があります(より一般的に言えば、戻り値が使用される瞬間まで)。最終的な目標は何ですか?synchronized(fooList)return foo;

于 2012-04-19T15:23:34.443 に答える
1

getFooFoo fooはローカル変数であり、かつfooList同期されているため、古いデータは返されません

単一のオブジェクトを共有するのではなく、各スレッド呼び出しが新しいFooオブジェクトを作成するため、ローカル変数はスレッド セーフです。複数のスレッドが にアクセスできるため、 variable はスレッド セーフではありませんfooListが、この場合、fooListは既に同期されています。

于 2012-04-19T15:23:41.080 に答える