我遇到了这个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();
}
}
答案 0 :(得分:12)
要回答标题“弹簧控制器线程安全”中的问题,Spring控制器是单例,因此它们应该以线程安全的方式实现,但是由您来确保您的实现实际上是线程安全的。
在您发布的代码中,您应该没问题,因为正如其他人指出的那样,GSON是线程安全的。
答案 1 :(得分:1)
Gson
绝对是线程安全的,并且是在2008年这样做的,所以只要您的版本发布,那么应该没问题。我发现您的代码没有线程安全问题。虽然我会将Gson
静态的实例。
答案 2 :(得分:0)
假设此控制器是作为普通的Spring“singleton”bean创建的,答案是 no 。
您可以将控制器创建为prototype bean,在这种情况下,将为每个请求创建一个新实例。如果您想这样做,更好的想法是将bean的范围定义为request
。
但是,我质疑任何控制器对象拥有成员变量的原因,除了错误确定bean的范围的可能性。这表明控制器正在尝试做太多的工作,并且应该将一些工作卸载到服务或辅助类。 MVC控制器应该做的唯一事情就是将请求数据传递到服务层,并检索要由视图显示的数据。
答案 3 :(得分:0)
就像servlets控制器请求处理程序方法也不是线程安全的。即/test
的多个请求可能会使许多线程执行测试方法。
在您的示例中,您不必担心线程安全,因为gson.toJson(results)
是gson上的唯一操作,并且似乎不会改变该对象的状态。