0

環境: 春のコンテナ

サービス層が構成されSingletonていて、サービス クラスにインスタンス変数 (状態変数) がないとします。

@Singleton
class MyService{
    public List<String> getNames(){
        List<String> list = entityManager.createQuery("");
        list.add("uknown");

        return list;
    }
}

メソッドに同時にアクセスしようとする複数の要求 (複数のスレッド) があるgetNames()場合、同期の問題が発生する可能性はありますか?

たとえば、リクエストが「不明な」名前を 2 回返す可能性はありますか?

4

2 に答える 2

0

サービス クラスはここで状態を保持しないため (この例では、サービス クラスにインスタンス変数はありません)、サービスは安全です。ローカル変数とパラメーターはスレッドに対してローカルです (ヒープではなくスタックに存在します)。

サービスに userProfile などの他のオブジェクトがある場合、そのようなオブジェクトはすべてのリクエストに依存するため、これらのオブジェクトはプロトタイプとしてスコープする必要があります。そうでなければ、このサービスは安全です。

これは私の質問の1つに似ています。Spring MVC コントローラーはシングルトンですか? サーブレットのスレッドセーフに関するTomaszの回答に投稿されたリンクを見てください。

于 2013-10-28T07:07:00.763 に答える
0

メソッド内のすべて

public List<String> getNames(){
    List<String> list = entityManager.createQuery("");
    list.add("uknown");

    return list;
}

リクエストにスコープされます。このentityManager呼び出しは、新しいListを追加する新しいインスタンスを返しますString。次に、そのリストを返します。メソッドを呼び出したスレッドのみがそのListインスタンスにアクセスできます (後で共有しない限り)。

同期の問題はありません。

于 2013-09-10T14:58:38.350 に答える