Spring中的bean是否线程安全,与Spring本身是无关的。Spring中会提供很多线程安全方面的策略,因此Spring中的bean也不具备线程安全的特性
在Spring的作用域中,有以下几种;
- prototype(多例)
- 每次getBean得到时候都会创建一个新的对象
- singleton(单例)
- 在Spring容器中只存在一个全局共享的实例
由此可见,
- prototype多例bean,每次都会创建新的实例,因此线程之间不存在共享问题,也就不存在线程安全问题。
- singleton单例bean,是所有的线程共享一个实例,因此可能会存在线程安全问题。
但是singleton单例bean又分为无状态bean和有状态bean。
- 无状态单例bean:在多线程操作中,只会对bean的成员变量进行查询操作,不会修改成员变量的值。这样的单例bean我们称之为
无状态单例bean
,这样的bean是不存在线程安全问题的。- 有状态单例bean:在多线程操作中,如果需要对bean中的成员变量进行数据更新操作,我们称这样的单例bean为
有状态单例bean
,这样的bean是可能 存在线程安全问题的。因此,我们可以得出结论
在Spring中,只有有状态的单例bean可能存在线程安全问题。
标签:变量,spring,安全,bean,线程,单例,Spring From: https://www.cnblogs.com/DuX1ao/p/17507425.html针对Spring使用过程中可能存在线程安全问题的bean,提供几种解决方式以供参考:
- 将作用域
singleton单例
改为prototype多例
。- 在bean中避免定义可变的成员变量,当然了,这种方式是不太现实的,没有很大的参考意义。
- 在类中定义
ThreadLocal
的成员变量,并将需要的可变成员变量保存在ThreadLocal中,因为ThreadLocal本身就具备线程隔离的特性,这就相当于为每个线程提供了一个独立的变量副本,每个线程只需要操作自己的线程变量副本,从而解决线程安全问题。