Spring Bean的线程安全
Spring Bean是线程安全的吗?
Spring中的Bean是否安全与spring容器无关,只是交给spring容器托管
Bean都是哪里来的:我们自己通过配置来声明的
Spring声明配置中通常会配置以下内容:
比如:class(全类名)
id(也就是Bean的唯一标识)
scope(作用域)
lazy-init(是否延迟加载)
哪些Bean会是不安全的
spring的作用域:
prototype(多例Bean)不存在线程安全问题
每次getBean的时候都会创建一个新的Bean对象
singleton(单例Bean)存在线程安全问题
在spring容器中只会存在一个全局共享的实例
单例Bean又存在无状态Bean和有状态Bean
无状态Bean:
多线程操作中只会对Bean的成员变量进行查询操作,不会修改成员变量的值
有状态的Bean:
多线程操作中如果需要对Bean中的成员变量进行数据更新操作
结论:在spring中只有有状态的单例Bean才会存在线程安全问题
解决方案:
1.将作用域“singleton”改为“prototype”
2.避免定义可变的成员变量
3.可变的成员变量保存在ThreadLocal中
ThreadLocal本身就存在线程隔离的特性,为每个线程提供了独立的变量副本,每个线程只需要操作自己的副本变量,从而解决线程安全问题。

浙公网安备 33010602011771号