学习记录.spring中的单例bean是线程安全的吗?

作用域:

singleton(单例):spring默认作用域,每一个bean在容器中仅有一个实例.(因为只有一个实例,当多个线程都执行该实例的同一个业务逻辑(成员方法)并且这个业务逻辑有对bean自身的成员变量进行修改,就会存在线程安全问题)

prototype(原型):每次getbean都创建一个新实例.(你有我有大家有,自然不存在竞争,也不存在线程安全问题了)


无状态bean:对于自身的成员变量只查询,不修改的bean,即不会做数据存储的bean.

有状态bean:对于自身的成员变量会做修改的bean,即有数据存储功能的bean.


答:spring并没有提供线程安全策略,因此,spring的单例bean其本身是不具备线程安全的特性的.

但是我们经常在项目中使用的bean都是无状态bean,比如Service类和Dao类.所以从某种程度上来说spring的单例bean是线程安全的.

 如果确实需要使用有状态bean,最简单的方法是将@Scope注解的值改为prototype.

或者将会变的成员变量保存在ThreadLocal中,TreadLocal本身具备线程隔离的特性,这样的话,每个线程都有自己的变量副本,只需要操作自己的变量副本就行.


总结:spring的单例bean本身不具备线程安全特性.如果使用无状态bean,则不需要考虑线程安全问题;如果使用有状态bean,就需要开发者自己保证线程安全和并发问题.


参考文章:

Spring中的Bean是线程安全的吗? - 知乎 (zhihu.com)

Spring 中的bean 是线程安全的吗? - myseries - 博客园 (cnblogs.com)

  • 16
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值