Spring Bean的线程安全问题
spring中bean作用域
五大作用域:
1.Proptotype
每次请求都会创建一个新的 Bean 实例,适合需要频繁变化的对象。
成员变量线程安全,静态变量线程不安全
2.sigleton(默认作用域)
Spring IOC容器仅存在一个Bean实例,Bean以单例方式存在,在创建容器时就同时自动创建了一个Bean对象。作用域范围是ApplicationContext中。
线程不安全:成员变量线程不安全,静态变量线程也不安全
3.request(仅限 Web 应用):每个 HTTP 请求都会创建一个新的 Bean 实例,请求结束后,Bean 实例被销毁。
4.session(仅限 Web 应用):每个 HTTP 会话创建一个 Bean 实例,会话结束后,实例被销毁。
5.globalSession(仅限 Web 应用):类似于 session 作用域,但适用于全局会话环境(如 Portlet 应用)。
单例模式下线程安全问题如何解决?
使用ThreadLocal来为每个线程提供独立的变量副本。
确保每个线程都有自己的变量副本,避免了共享状态。