【问题标题】:Spring Controller singleton ObjectSpring Controller 单例对象
【发布时间】:2015-04-17 16:07:14
【问题描述】:

我对控制器对象有点困惑。据我所知,控制器默认是单例的。如果线程 1 执行到第 9 行并将 empId 设为 12,线程 2 从线程 1 获得控制权并将 empId 设为 23 并完成整个方法的执行,然后再次执行线程 1,则单例如何适用于 Web 应用程序,如下面的代码执行 empId 的值是 12 还是 23。

而且我还注意到,只为 UserServiceDao 类创建了一个对象,因此如何在 spring mvc 中管理线程,每个线程都有自己的实例。

1 public class ActionController {
2
3   @Autowired
4   UserServiceDao userServiceDao;
5   
    int count = 1;
6   
7   @RequestMapping("/dashboard.htm")
8       public ModelAndView dashboard(HttpServletRequest request) {
9           String empId = request.getParameter("empId");
10          UserProfile userProfile = userServiceDao.loadEmpById(empId);
            System.out.println(count);
            count++;

11      }
12  }

    Thread first output: 1;
    Thread second output : 2; 

谢谢。

【问题讨论】:

    标签: java spring spring-mvc


    【解决方案1】:

    在控制器中,您没有任何实例变量来保持任何控制器方法调用的状态。所有变量都是方法(局部)变量,从未在线程之间共享,因此以多线程方式使用它没有问题。

    和使用servlet一样。

    方法(本地)变量驻留在堆栈上,并且范围仅限于方法的末尾。这里empId是局部变量,不被多个线程共享。

    同样,UserServiceDao 不应包含任何实例变量来保持其方法调用的状态。

    看下图:

    阅读更多Thread safety of instance methods that have local variables only

    【讨论】:

    • int count 将在线程之间共享。所以你的意思是说实例变量在控制器,服务或存储库中的线程之间共享,你也可以分享图像,因为它不可见。
    • 示波器什么时候出现,什么时候用?请看下面tutorials point的网址
    【解决方案2】:

    控制器及其所有依赖项通常是无状态的,因此无需担心并发访问。尤其要让你的 DAO 保持无状态。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-25
      • 2018-05-20
      • 2021-10-29
      • 2020-11-02
      • 1970-01-01
      • 1970-01-01
      • 2023-03-20
      • 1970-01-01
      相关资源
      最近更新 更多