Spring线程安全

Spring管理的对象基本都应该是无状态的  ,spring单例 线程安全

 

 Spring 容器中的  Bean  也是运行于多线程的环境下。在绝大多数情况下, Spring  的  Bean  都是单实例的( singleton ),单实例  Bean  的最大的好处是线程无关性,不存在多线程并发访问的问题,也即是线程安全的。  

 

Spring的 DAO 模板类并未采用线程同步机制,因为线程同步限制了并发访问,会带来很大的性能损失。  

 

ThreadLocal在 Spring 中发挥着重要的作用,在管理 request 作用域的 Bean 、事务管理、任务调度、 AOP 等模块都出现了它们的身影,起着举足轻重的作用  

 

当使用ThreadLocal 维护变量时, ThreadLocal 为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以 独立地改变自己的副本,而不会影响其它线程所对应的副本。

 

ThreadLocal是如何做到为每一个线程维护变量的副本的呢?其实实现的思路很简单:在 ThreadLocal 类中有一个 Map ,用于存储每一个线程的变量副本, Map 中元素的键为线程对象,而值对应线程的变量副本。  

 

Spring使用 ThreadLocal 解决线程安全问题

我们知道在一般情况下,只有无状态的Bean 才可以在多线程环境下共享,在 Spring 中,绝大部分 Bean 都可以声明为 singleton 作用域。就是因为 Spring 对一些 Bean (如 RequestContextHolderTransactionSynchronizationManagerLocaleContextHolder 等)中非线程安全状态采用 ThreadLocal 进行处理,让它们也成为线程安全的状态,因为有状态的 Bean 就可以在多线程中共享了。

 

 

singleton作用域

当一个bean 的作用域设置为 singleton ,那么 Spring IOC 容器中只会存在一个共享的 bean 实例,并且所有对 bean 的请求,只要 id 与该 bean 定义相匹配,则只会返回 bean 的同一实例。换言之,当把一个 bean 定义设置为 singleton 作用域时, Spring IOC 容器只会创建该 bean 定义的唯一实例。这个单一实例会被存储到单例缓存( singleton cache )中,并且所有针对该 bean 的后续请求和引用都将返回被缓存的对象实例,这里要注意的是 singleton 作用域和 GOF 设计模式中的单例是完全不同的,单例设计模式表示一个 ClassLoader 中只有一个 class 存在,而这里的 singleton 则表示一个容器对应一个 bean ,也就是说当一个 bean 被标识为 singleton 时候, springIOC 容器中只会存在一个该 bean

配置实例:


<bean id="role" class="spring.chapter2.maryGame.Role" scope="singleton"/>

或者


<bean id="role" class="spring.chapter2.maryGame.Role" singleton="true"/>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值