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

先给出答案,不一定是线程安全的。

可以从两部分来解释这个问题。

  • Servlet容器
  • Spring中Bean的作用域

Servlet容器

一般来说,每个用户请求到达Servlet容器后,容器都会新开一个线程来处理这个请求,当多个Bean被多个线程同时请求时,如果Bean中有共享变量的存在,那么就可能会出现线程安全问题。

多线程并发会导致线程安全问题的原因有

  • 存在共享变量
  • 多个线程都需要对共享变量进行读写

Spring中的Bean作用域

Spring中的Bean作用域有五种

  • Singleton:单例,整个Spring生命周期中,该Bean只会实例化一个
  • Prototype:原型,每次调用Bean时都会生成一个新的实例对象
  • Request:每次用户请求时,都会生成新的实例对象
  • Session:每个Session的生命周期,仅有一个实例对象
  • GlobalSession

在Spring中,绝大多数情况下,我们的Bean的生命周期都是Singleton,那么如果Singleton下的Bean实例中有实例变量的情况下,多线程并发访问该Bean就可能会导致线程安全问题