Spring中的Bean是线程安全的吗?

本文探讨了Spring框架中Bean的四种作用域,包括Singleton、Prototype、Request和Session,重点分析了Singleton作用域下的线程安全问题。通过示例展示了无状态和有状态Bean在多线程环境下的行为,并指出静态变量在原型作用域下仍可能导致线程不安全。解决方案包括使用Prototype作用域和ThreadLocal来确保线程安全。
摘要由CSDN通过智能技术生成

Spring的Bean的作用域

  1. Singleton:默认的作用域,生成单例对象,生命周期跟SpringIOC容器一样,第一次注入时创建
  2. Prototype:原型,每次生成新的对象
  3. Request:每次Http请求创建一个单例对象,那次请求就一直使用这个对象
  4. Session:同一个会话使用同一个对象,不同会话使用不同对象
  5. Global-session:所有会话使用同一个实例

说明

Singleton作用域下所有线程使用同一个Bean,因此存在资源竞争问题。
如果单例Bean是无状态的,就是不存储数据,例如Spring mvc 的 Controller、Service、Dao等,就只是执行方法操作而不关注对象本身的状态。因为Controller等每次调用里面的方法JVM都会生成线程私有的栈,因此执行方法是不存在线程不安全的。
如果里面有数据存储,例如private int count = 0; 就表示是有状态的

@Controller
public class controller {
   private int count = 0;
   @ResponseBody
   @GetMapping("/count")
    public String addCount(){
       count++;
       System.out.println("count的值为:"+count);
       return "Success";
   }
}

发送多个请求,结果是
结果
说明线程不安全,可以把Controller的作用域改为prototype
修改作用域
结果变成线程安全。
结果2
如果Bean中有静态变量 ,例如 private static int count = 0;,作用域变为原型也是线程不安全,**这种情况下可以使用ThreadLocal保证线程安全。**当然可以加锁解决变量共享问题。
结果3

参考

聊一聊Spring中的线程安全性
Spring 中的bean 是线程安全的吗?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值