了解Controller单例行为Spring MVC

时间:2019-08-15 05:49:54

标签: spring-mvc concurrency

我正在使用spring MVC控制器,并且了解它是一个Singleton。我只想确保我对比赛条件的理解是正确的。

SomeClass.log.get().append("|").append(whatever);

如果我做这样的事情,那是否意味着到同一主机的请求有时即使出现错误,也将表明没有错误。我的理解是:如果同时发出2个请求,一个请求.row { zoom: 1; /* For IE 6/7 (trigger hasLayout) */ } .two { text-align: center; background-color: aqua; margin: 0; padding: 30px; border-radius: 0; margin-right: -100px; },另一个请求<div class="row two"> <h2>Here’s how Babbel gets you conversational fast!</h2> </div>,则可能发生@Controller public class MyController { private List<String> errors; @RequestMapping("/page1") public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) { ModelAndView mav; //initialize errors = new ArrayList<>(); try { //do something } catch (Exception e) { errors.add("123"); // point A1 } mav.addObject("error", errors"); // point A2 } @RequestMapping("/page2") public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) { ModelAndView mav; //initialize errors = new ArrayList<>(); //point B1 try { //do something } catch (Exception e) { errors.add("568"); //point B2 } mav.addObject("error", errors"); } } 处理引发异常并将错误值添加到错误列表的情况[page1,但在page2运行之前,page1可以运行并清空列表。因此,我们应该始终使用局部变量。

1 个答案:

答案 0 :(得分:1)

是的。因为Singleton意味着只有一个MyController实例,这意味着只有一个List<String> errors

如果多个线程(每个HTTP请求在一个线程上运行)操纵同一列表中的数据,则它们可能会相互混淆。

这就是为什么您应该将错误列表移至每个控制器方法内的私有变量的原因。