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 @   开源遗迹  阅读(495)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示