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

1 篇文章 0 订阅
1 篇文章 0 订阅

结论:

Spring中的Bean是否线程安全,跟Spring容器本身无关。
Spring中的Bean本身也不具备线程安全的特性。

Spring中的Bean从哪里来的?

除了Spring中内置的,其他的Bean我们自己通过Spring配置来声明的,然后由Spring容器来统一进行加载。

Spring声明配置中通常会配置以下内容:

比如:

  • class(全类名)
  • id(也就是Bean的唯一标识)
  • scope(作用域)
  • lazy-init(是否延时加载)
  • 等等
    之后Spring容器会根据这些配置内容来使用对应的策略来进行创建实例,因此,Spring中的Bean都是根据我们自己写的类来创建的实例,Spring中的Bean是否线程安全,跟Spring容器本身无关。只是交给Spring容器托管而已。

Spring容器中什么样的Bean会存在线程安全问题?

Spring Bean的作用域:

  • prototype(多例Bean)
    每次getBean的时候都会创建一个新的对象实例
    也就是线程之间不存在Bean共享的问题,多例Bean是不存在线程共享问题的。
  • singleton(单例Bean)
    在Spring容器中只会存在一个全局共享的实例
    因此可能会存在线程安全问题。
    单例Bean又分为:
  • 无状态Bean
    多线程操作中,只会对Bean的成员变量进行查询操作,不会修改成员变量的值
  • 有状态Bean
  • 多线程操作中,如果需要对Bean中的成员变量进行数据更新操作,可能存在线程安全问题

如何处理有状态Bean的线程安全问题?

  • 将 “singleton” 改为 "prototype"
  • 避免定义可变的成员变量
  • 在类中定义ThreadLocal的成员变量,并将需要的可变成员变量,保存在ThreadLocal中,ThreadLocal本身具备线程隔离的特性,这就相当于为每个线程提供了一个独立的变量副本,每个线程只需要操作自己的线程变量副本,从而解决线程安全问题。
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值