Spring中的单例bean的线程安全问题 您所在的位置:网站首页 bean是线程安全的吗是什么 Spring中的单例bean的线程安全问题

Spring中的单例bean的线程安全问题

2024-01-27 10:30| 来源: 网络整理| 查看: 265

Spring中的单例bean的线程安全问题

因为成员变量是存放在堆内存中,而堆内存又是线程共享的,这就造成了线程安全问题

因为Spring中的Bean默认是单例的,所以在定义成员变量时也有可能会发生线程安全问题

单例的bean 多线程共享,存在资源竞争。如果单例bean 只关注于方法,不会对Bean的成员执行查询以外的操作,这个bean是线程安全的。 重点在于有无对bean 属性的查询以外操作。

Spring容器中的Bean是否线程安全,容器本身并没有提供Bean的线程安全策略,因此可以说Spring容器中的Bean本身不具备线程安全的特性,但是具体还是要结合具体scope的Bean去研究。

Spring 的 bean 作用域(scope)类型

类别说明singleton在Spring ioc 容器中仅存在一个Bean实例,Bean以单例方式存在,默认值prototype每次从容器中调用Bean时,都会返回一个新的实例,即每次调用getBean()时,相当于执行new XXxBean()request每次HTTP请求都会创建一个新的Bean,该作用域仅适用于WebApplicationContext环境session同一个HTTP Session共享一个Bean,不同Session使用不同的Bean,仅适用于WebApplicationContext环境global-session一般用于Portlet应用环境,该作用域仅适用于WebApplicationContext环境,全局会话,所有会话共享一个实例。

线程安全这个问题,要从单例与原型Bean分别进行说明。

原型Bean 对于原型Bean,每次创建一个新对象,也就是线程之间并不存在Bean共享,自然是不会有线程安全的问题。

单例Bean 对于单例Bean,所有线程都共享一个单例实例Bean,因此是存在资源的竞争。

如果单例Bean,是一个无状态Bean,也就是线程中的操作不会对Bean的成员执行查询以外的操作,那么这个单例Bean是线程安全的。比如Spring mvc 的 Controller、Service、Dao等,这些Bean大多是无状态的,只关注于方法本身。

对于有状态的bean,Spring官方提供的bean,一般提供了通过ThreadLocal去解决线程安全的方法,比如RequestContextHolder、TransactionSynchronizationManager、LocaleContextHolder等。 注: Spring容器本身并没有提供线程安全的策略,因此是否线程安全完全取决于Bean本身的特性。

使用ThreadLocal的好处 使得多线程场景下,多个线程对这个单例Bean的成员变量并不存在资源的竞争,因为ThreadLocal为每个线程保存线程私有的数据。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有