Spring中bean是线程安全的吗?
其实在spring框架中,并没有提供bean的线程安全策略,所以,spring容器中的bean并不具备线程安全的特性。
1 spring中bean的作用域
1)singleton:单例bean,每个容器中只有一个bean的实例,Spring中的bean默认都是单例的
2)prototype:每次请求都会创建一个新的bean实例
3)request:每一次HTTP请求都会创建一个新的bean实例,该bean仅在当前HTTP request内有效,在请求完成后,bean会失效并被垃圾回收器回收。
4)session:每一次HTTP请求都会创建一个新的bean,该bean仅在当前HTTP session内有效。同一个session会话共享一个实例,不同的会话使用不同的实例。
5)global-session:全局session作用域,所有会话共享一个实例。如果想要声明让所有会话共享实例的话,那么这个全局变量需要存储在global-session中
而平时中,我们常见的作用域就是singleton和prototype。
prototype(多例bean):对于prototype中作用域中的bean,因为每次getBean的时候,都会创建一个新的对象,线程之间不存在Bean共享问题,因此prototype作用域下的bean不存在线程安全问题。
singleton(单例bean):对于singleton作用域中的bean,所有的线程都是共享一个单例实例的bean,因此是存在线程安全问题的,但是如果单例bean是一个无状态的bean,即多线程操作中不会对bean的成员变量进行查询以外的操作(不存在多个线程同时写这个成员变量的场景),那么这个单例bean就是线程安全的。
- 有状态的bean:就是有实例变量的对象,可以保存数据,是非线程安全的。
- 无状态的bean:就是没有实例变量的对象,不能保存数据,是线程安全的。
解决方案:
以上只是部分内容,为了维护方便,本文已迁移到新地址:Spring中的bean线程安全吗 – 编程屋