当前位置: 首页 > news >正文

spring容器的bean是单例还是多例的?线程安全吗?

答:

spring容器的bean默认是单例的。默认是项目启动时实例化的,(如果想要延迟初始化,通过@lazy注解可以延迟初始化)。


spring容器的的bean线程

首先,bean的线程安全取决于bean的状态及bean的作用域。

singleton

如果无状态的bean,内部不保存任何状态信息,则线程安全。

如果有状态的bean,内部会保存有状态信息,多个线程操作该bean可能出现数据不一致问题,这样的bean线程不安全。

// 线程安全(无状态)
@Service
public class StatelessService {public String process(String data) {return "Processed: " + data; // 不依赖实例变量}
}// 线程不安全(有状态)
@Service
public class StatefulService {private int count = 0; // 共享变量,多线程可能冲突public void increment() {count++; // 非原子操作,存在竞态条件}
}

 Prototype

  • 每次请求都会创建新的 bean 实例,因此每个线程使用独立的实例,通常是线程安全的(除非 bean 内部使用了静态变量或其他共享资源)。
  • 原型 bean 的生命周期由调用者管理,Spring 容器只负责创建,不负责后续管理。

线程安全的解决方案

  • 无状态设计:优先使用无状态 bean,避免共享实例变量。
  • 使用 ThreadLocal:为每个线程存储独立变量。
  • @Service
    public class ThreadLocalService {private ThreadLocal<Integer> threadData = ThreadLocal.withInitial(() -> 0);public void setData(int value) {threadData.set(value); // 每个线程独立存储}
    }

  • 同步机制:对有状态 bean,使用synchronizedLock或原子类(如AtomicInteger)。

http://www.lryc.cn/news/590455.html

相关文章:

  • 【PTA数据结构 | C语言版】构建后缀树
  • PHP 社区正在讨论变更许可证,预计 PHP 9.0 版本将完全生效
  • PyTorch深度学习框架入门案例实战
  • 代码随想录算法训练营第五十一天|图论part2
  • (新手友好)MySQL学习笔记(完):事务和锁
  • 第三章.Redis数据类型详解——string篇
  • 用 urllib 开启爬虫之门:从零掌握网页数据抓取
  • Vue3+Ts实现父子组件间传值的两种方式
  • 自动驾驶激光3D点云处理系统性阐述及Open3D库函数应用
  • 【Elsa Workflows】Elsa Workflows审批流全功能扩展
  • string类【C++】
  • 面试问题:
  • BASE64编码通俗介绍
  • Towards Low Light Enhancement with RAW Images 论文阅读
  • 北京-4年功能测试2年空窗-报培训班学测开-第五十二天
  • linux服务器stress-ng的使用
  • WAMP允许远程访问
  • 30 天自制 C++ 服务器--Day3
  • 用python实现自动化布尔盲注
  • RHCSA(软链接与硬链接)
  • 高性能架构模式——高性能缓存架构
  • sqli-labs靶场通关笔记:第23关 注释符过滤
  • 二、CV_AlexNet
  • 81、面向服务开发方法
  • 关于SaaS业务模式及其系统架构构建的详细解析
  • 横向移动(下)
  • IPD-流程设计-TE角色说明书参考模板
  • 多维傅里叶变换性质与计算
  • CSS3动画基本使用——页面一打开盒子就从左边走向右边
  • 【尝试】本地部署openai-whisper,通过 http请求识别