在 Spring 框架中,Bean 的线程安全性取决于其作用域(Scope)和具体的实现方式。默认情况下,Spring 的 Bean 是单例(Singleton)的,而单例 Bean 本身不保证线程安全,需要开发者根据业务场景合理处理。以下是详细分析及解决方案:
1. Spring Bean 的线程安全性分析
(1)单例(Singleton)作用域的 Bean
- 特点:容器中仅有一个实例,所有线程共享该实例。
- 线程安全性:
- 无状态 Bean:如果 Bean 不保存可变成员变量(即所有操作仅依赖方法参数或只读数据),则是线程安全的。
@Service public class StatelessService { // 无成员变量,线程安全 public String process(String input) { return input.toUpperCase(); } }
- 有状态 Bean:如果 Bean 包含可修改的成员变量,则线程不安全。
@Service public class StatefulService { private int counter = 0; // 可变成员变量 public void increment() { counter++; // 非原子操作,线程不安全! } }
- 无状态 Bean:如果 Bean 不保存可变成员变量(即所有操作仅依赖方法参数或只读数据),则是线程安全的。
(2)原型(Prototype)作用域的 Bean
- 特点:每次请求都创建新实例,不同线程使用不同实例。
- 线程安全性:天然线程安全(但需注意注入时的上下文传递问题)。
@Service @Scope("prototype") public class PrototypeService { private int counter