spring生成对象默认是Singleton(单例)的,这样可以避免每次创建新的对象,减少垃圾对象。当request过来,不用每次创建Controller,会用原来的instance去处理。此时会存在一个问题,这个controllerl内部声明了实例变量,当多个线程调用它的时候,多个线程访问的是同一个对象变量,就会产生线程安全问题。
解决在controller内部声明全局变量的方法:
1.不声明全局变量,成员变量定义在方法中(推荐),
2.在Controller中使用ThreadLocal来做数据隔离,
3.在spring配置文件Controller中声明 scope="prototype",每次都创建新的controller对象。代价就是增大了系统开销,这似乎也违背了SpringMVC框架的初衷。
总结:除非在bean中声明了实例变量,否则不需要考虑线程安全的问题,比如dao,service,controller等.
参考链接:
https://www.jianshu.com/p/fe2824f35739