12

我遇到了这个 Controller 示例,想知道它是否是线程安全的?我特别想知道 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

要回答标题中的问题,“Spring 控制器是线程安全的”,Spring 控制器是单例的,因此它们应该以线程安全的方式实现,但您需要确保您的实现实际上是线程安全的。

在您发布的代码中,您应该没问题,因为正如其他人指出的那样,GSON 是线程安全的。

于 2013-01-03T19:37:06.180 回答
1

假设这个控制器被创建为一个普通的 Spring“单例”bean,答案是否定的。

您可以将控制器创建为原型bean,在这种情况下,将为每个请求创建一个新实例。如果你想这样做,一个更好的主意是将你的 bean 的范围定义为request.

但是,我质疑任何控制器对象具有成员变量的原因,除了可能错误地确定 bean 的范围。这表明控制器正在尝试做太多工作,并且应该将其中一些工作卸载到服务或帮助程序类。MVC 控制器应该做的唯一事情是将请求数据传递到服务层,并检索要由视图显示的数据。

于 2013-01-03T19:29:34.977 回答
1

Gson绝对是线程安全的,并且早在 2008 年就以这种方式制作,所以只要你的版本是发布的,那么它应该没问题。我发现您的代码没有线程安全问题。虽然我会制作Gson静态的实例。

于 2013-01-03T19:34:25.177 回答
0

就像 servlet 控制器请求处理程序方法也不是线程安全的。即多个请求/test可能使许多线程执行测试方法。

在您的示例中,您不必担心线程安全,因为这gson.toJson(results)是 gson 上的唯一操作,并且似乎它不会改变该对象的状态。

于 2013-01-03T19:34:28.257 回答