SpringBoot从入门到精通 - springMVC Controller 是单例还是多线程/线程是否安全

本文探讨了SpringBoot应用中Controller、Service的线程安全问题。Spring MVC的Controller默认是Singleton,但在并发访问时需注意实例变量的线程安全。无状态对象如Service、DAO是线程安全的,而有状态对象如Action需设置为Prototype。解决方案包括避免使用实例变量、设置为原型作用域或使用ThreadLocal。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有状态和无状态的对象基本概念: 
有状态对象(Stateful Bean),就是有实例变量的对象 ,可以保存数据,是非线程安全的。一般是prototype scope。
无状态对象(Stateless Bean),就是没有实例变量的对象,不能保存数据,是不变类,是线程安全的。一般是singleton scope。

如Struts2中的Action,假如内部有实例变量User,当调用新增用户方法时,user是用来保存数据,那么此action是有状态对象。多个线程同时访问此action时 会造成user变量的不一致。所以action的scope要设计成prototype,或者,User类放到threadLocal里来保持多个线程不会造成User变量的乱串(此种场景没必要放到threadLocal内)。

而Service内部一般只有dao实例变量 如userDao, 因为userDao是无状态的对象(内部无实例变量且不能保存数据),所以service也是无状态的对象。

public   class  XxxAction{

   // 由于多线程环境下,user是引用对象,是非线程安全的  

  public  User user;

  ......

}

public   class  XxxService {  

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

未来AI编程

共鸣===鼓励 打赏您随意

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值