没有合适的资源?快使用搜索试试~ 我知道了~
Spring并发访问的线程安全性问题.docx
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 59 浏览量
2022-06-19
16:00:58
上传
评论
收藏 16KB DOCX 举报
温馨提示
试读
4页
springmvc的controller是singleton的(非线程安全的),这也许就是他和struts2的区别吧和Struts一样,Spring的Controller默认是Singleton的,这意味着每个request过来,系统都会用原有的instance去处理,这样导致了两个结果:一是我们不用每次创建Controller,二是减少了对象创建和垃圾收集的时间;由于只有一个Controller的instance,当多个线程调用它的时候,它里面的instance变量就不是线程安全的了,会发生窜数据的问题。
资源推荐
资源详情
资源评论
Spring 并发访问的线程安全性问题
springmvc 的 controller 是 singleton 的(非线程安全的),这也许就是他和
struts2 的区别吧和 Struts 一样,Spring 的 Controller 默认是 Singleton 的,这
意味着每个 request 过来,系统都会用原有的 instance 去处理,这样导致了两
个结果:一是我们不用每次创建 Controller,二是减少了对象创建和垃圾收集的
时间;由于只有一个 Controller 的 instance,当多个线程调用它的时候,它里面
的 instance 变量就不是线程安全的了,会发生窜数据的问题。
当然大多数情况下,我们根本不需要考虑线程安全的问题,比如 dao,service 等,
除非在 bean 中声明了实例变量。因此,我们在使用 spring mvc 的 contrller 时,
应避免在 controller 中定义实例变量。
如:
public class Controller extends AbstractCommandController {
......
protected ModelAndView handle(HttpServletRequest
request,HttpServletResponse response,
Object command,BindException errors) throws Exception {
company = ................;
}
protected Company company;
}
在这里有声明一个变量 company,这里就存在并发线程安全的问题。
如果控制器是使用单例形式,且 controller 中有一个私有的变量 a,所有请求到同
一个 controller 时,使用的 a 变量是共用的,即若是某个请求中修改了这个变量
a,则,在别的请求中能够读到这个修改的内容。。
有几种解决方法:
1、在 Controller 中使用 ThreadLocal 变量
2、在 spring 配置文件 Controller 中声明 scope="prototype",每次都创建新的
controller
资源评论
小兔子平安
- 粉丝: 209
- 资源: 1940
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功