Spring bean是线程不安全的。一般情况下,只有无状态的Bean才可以在多线程环境下共享。在Spring中,绝大部分Bean都可以声明为singleton作用域。单例模式下的bean应该是无状态的bean,不然可能会造成多线程并发修改状态的问题。
对于有状态的bean解决方案有如下几种:
- scope="prototype"
- ThreadLocal
- 代码控制同步,比如加锁
- new对象
Spring对一些(如RequestContextHolder、TransactionSynchronizationManager、LocaleContextHolder等)中非线程安全状态的bean采用ThreadLocal进行处理,让它们也成为线程安全的状态,因此有状态的Bean就可以在多线程中共享了
reference:https://blog.csdn.net/a236209186/article/details/61460211