12

このコントローラーの例に出くわしましたが、スレッドセーフかどうか疑問に思っていますか?gsonインスタンス変数について具体的に疑問に思っています。

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import com.google.gson.Gson;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Controller
public class TestController {

    private final Gson gson = new Gson();

    @RequestMapping(value = "/test", method = RequestMethod.GET)
    public void test(HttpServletResponse res, HttpServletRequest req) throws IOException {
        HashMap<String, String> hm = new HashMap();
        res.getWriter().print(gson.toJson(results));
        res.getWriter().close();
    }
}
4

4 に答える 4

13

「SpringControllersはスレッドセーフですか」というタイトルの質問に答えるには、Spring Controllersはシングルトンであるため、スレッドセーフな方法で実装する必要がありますが、実装が実際にスレッドセーフであることを確認するのはあなた次第です。

他の人が指摘しているように、GSONはスレッドセーフであるため、投稿するコードでは問題ないはずです。

于 2013-01-03T19:37:06.180 に答える
1

Gson間違いなくスレッドセーフであり、2008年にこのように作成されたので、バージョンが投稿されている限り、問題はありません。コードにスレッドセーフの問題はありません。インスタンスをGson静的にしますが。

于 2013-01-03T19:34:25.177 に答える
1

このコントローラーが通常のSpring「シングルトン」Beanとして作成されていると仮定すると、答えはノーです。

コントローラをプロトタイプBeanとして作成できます。その場合、リクエストごとに新しいインスタンスが作成されます。これを実行したい場合は、Beanのスコープをとして定義することをお勧めしますrequest

ただし、 Beanのスコープが正しくない可能性は別として、コントローラーオブジェクトにメンバー変数がある理由については疑問があります。これは、コントローラーが多くの作業を実行しようとしていること、およびその作業の一部をサービスクラスまたはヘルパークラスにオフロードする必要があることを示しています。MVCコントローラーが実行する必要があるのは、要求データをサービスレイヤーに渡し、ビューに表示されるデータを取得することだけです。

于 2013-01-03T19:29:34.977 に答える
0

サーブレットのように、コントローラのリクエストハンドラメソッドもスレッドセーフではありません。つまり、複数のリクエストで/test多くのスレッドにテストメソッドを実行させることができます。

あなたの例でgson.toJson(results)は、gsonでの唯一の操作であり、そのオブジェクトの状態を変更しないように見えるため、スレッドセーフについて心配する必要はありません。

于 2013-01-03T19:34:28.257 に答える