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本身就存在线程隔离的特性,为每个线程提供了独立的变量副本,每个线程只需要操作自己的副本变量,从而解决线程安全问题。

 

posted @ 2022-04-15 21:06  开源遗迹  阅读(515)  评论(0)    收藏  举报