跳至主要內容

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 中定义了可修改的成员变量,是要考虑线程安全问题的,可以使用多例或者加锁来解决。

整理完毕,完结撒花~ 🌻

上次编辑于:
贡献者: Andy