9、IOC 容器中的单例 Bean 的线程安全问题
大约 1 分钟
9、IOC 容器中的单例 Bean 的线程安全问题
1.知识点回顾
在 Spring 中我们可以通过 @Scope
注解来指定 Bean 的创建方式。
@Servcie
@Scope("singleton")
public class UserServiceImpl implements UserService {
}
@Scope
注解的值有两种:
- singleton:Bean 在每个 Spring IOC 容器中只有一个实例,即:单例模式。
- prototype:一个 Bean 的定义可以有多个实例,即:原型模式。
当没有手动指定 Bean 的创建方式时,Spring 框架默认是使用单例模式来创建 Bean 的。
2.线程安全
我们知道 Spring 容器中的 Bean 都是单例的了,那么它是线程安全的吗?
其实 Spring 容器中的单例 Bean 并不是线程安全的,下面我们来举个例子:

上面这段代码就是一段简单的根据 ID 查询用户信息的接口,首先这里有三个需要注意的点:
1、 UserController
本身就是一个注入到 Spring 容器中的 Bean;
2、 count
是 UserController 的一个成员变量,是线程不安全的;
3、 userService
也是 UserController 的一个成员变量,由于 userService 是单例的,其本身是无状态的对象,假如其内部不存在可修改的成员变量,则是线程安全的;
3.总结
- Spring 框架中的单例 Bean 不是线程安全的。
- Spring 框架中有一个 @Scope 注解,默认的值是 singleton,表示以单例模式创建 Bean。
- 因为一般在 Spring 的 Bean 中都是注入无状态的对象,没有线程安全问题,如果在 Bean 中定义了可修改的成员变量,是要考虑线程安全问题的,可以使用多例或者加锁来解决。
整理完毕,完结撒花~ 🌻