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本身就存在线程隔离的特性,为每个线程提供了独立的变量副本,每个线程只需要操作自己的副本变量,从而解决线程安全问题。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了