spring中的bean是线程安全的吗?

首先看一下思维脑图:

结论:spring中的bean是否线程安全,是和spring容器没有关系的。

解析:spring框架中会提供很多线程安全的策略,因此spring中的bean也不具备线程安全的特性。

1.spring中的bean从哪里来?

--spring中除了很多的内置bean以外,其他的bean都是我们自己通过配置来声明的,然后由spring容器进行统一加载。

spring声明配置中有以下几类内容:

比如:class(全类名)、id(bean的唯一标识)、scope(作用域)、lazy-init(是否延时加载)等一些配置

之后,spring会根据这些配置内容,使用对应的策略来进行创建实例,因此spring中的bean,都是根据我们自己写的类来创建实例的。spring中的bean是否线程安全,也跟spring容器无关,只是交给spring容器托管而已。

2.那么,在spring中什么样的bean会存在线程安全问题呢?

--首先,我们回顾spring bean的作用域。在spring定义的作用域中,其中

prototype(多例bean)

每次getBean的时候都会创建一个新的对象

singleton(单例bean)

在spring容器中只会存在一个全局共享的实例

以上对作用域的理解,下面我们可以分析下spring容器中什么样的bean,会存在线程安全呢?

多例的bean每次都会新创建新的实例,也就是说线程之间不存在bean共享的问题,因此多例bean是不存在线程安全问题。而单例bean,是所有线程共享一个实例,因此可能会存在线程安全的问题,但是有一个问题:单例bean又分为:无状态bean和有状态bean.

无状态单例bean:

  在多线程中只会对bean的成员变量进行查询操作,不会修改成员变量的值,所以无状态单例bean不存在线程安全问题

有状态单例bean:

  多线程操作中如果需要对bean中的成员变量进行数据更新操作,所以有状态单例bean可能存在线程安全问题

结论:

最终得出结论,在spring容器中,有状态的单例bean才会存在线程安全问题。

3.如何处理bean线程安全问题?

(1)将bean的作用域,singleton(单例)改为prototype(多例)

(2)避免定义可变的成员变量,(这不太现实,当我没说- -!)

(3)可变成员变量保存在ThreadLocal中

        在类中定义ThreadLocal的成员变量,并将需要的可变成员变量,保存在ThreadLocal中。

ThreadLocal本身具备,线程隔离的特性,相当于为每一个线程提供了一个独立的变量副本,每个线程只操作自己的变量副本,从何解决线程安全问题。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值