Bean 的分类
Bean 分为有状态的 bean 和无状态的 bean
- 有状态:指对象中存在有实例变量(成员变量),可以保存数据,是非线程安全的
- 无状态:指对象中不存在实例变量(成员变量),即不能保存实例数据,这样的bean是多线程安全的,可以在多线程环境下进行共享
Spring 的线程安全问题
在 spring 中,bean 默认是单实例,即 ioc 容器中一个类只会存在一个实例对象
- 绝大多数的 bean 是无状态的,如 controller、sevice、dao 中的这些类通常不含有成员变量,即为无状态的 bean,因此在多线程环境下不会产生线程安全问题(因此要避免在这些类中定义成员变量)
- 对于有状态的 bean
- Spring 采用 ThreadLocal 进行处理,使它们成为线程安全的 bean
- 或者使用原型模式 prototype,即每次使用时都会生成一个对象,解决多线程环境下的线程安全问题
总结:
- 无状态的 bean 适合单例模式,可以在多线程环境下共享实例,提高性能
- 有状态的 bean 适合原型模式 prototype,保证每次请求都会获取一个新的 bean