Spring中的单例Bean是线程安全的吗?

Spring框架中的单例Bean是线程安全的么?

Spring中的Bean默认是单例模式的,框架并没有对bean进行多线程的封装处理。
如果Bean是有状态的那就需要开发人员自己来进行线程安全的保证, 最简单的办法就是改变bean的作用域把 "singleton"改为'protopyte'这样每次请求Bean就相当于是new Bean() 这样就可以保证线程的安全了。

  1. 有状态就是有数据存储功能 (比方是servic 里面存了一个count值 用于记数,这个就不是线程安全的)
  2. 无状态就是不会保存数据 controller、service和dao层本身并不是线程安全的, 只是如果只是调用里面的 方法,而且多线程调用一个实例的方法,会在内存中复制变量,这是自己的线程的工作内存,是安全的。

Dao会操作数据库Connection, Connection是带有状态的, 比如说数据库事务, Spring的事务管理器使用 Thread local为不同线程维护了一套独立的connection副本, 保证线程之间不会互相影响(Spring是如何保证事务 获取同一个Connection的)

不要在bean中声明任何有状态的实例变量或类变量, 如果必须如此, 那么就使用Thread Local把变量变为线程私 有的, 如果bean的实例变量或类变量需要在多个线程之间共享, 那么就只能使用synchronized、lock、CAS等这 些实现线程同步的方法了。

posted @   来自未来的信  阅读(129)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· 2 本地部署DeepSeek模型构建本地知识库+联网搜索详细步骤
点击右上角即可分享
微信分享提示