Spring IOC 容器中 singleton 模式的线程安全

spring中管理的bean实例默认情况下是单例的[sigleton类型]
按其作用域来讲有sigleton(单例),prototype(原型),request,session,global session。

spring中的单例与设计模式里面的单例略有不同
,设计模式的单例是在整个应用中只有一个实例,而spring中的单例是在一个IoC容器中就只有一个实例。

spring中的单例也不会影响应用的并发访问,【不会出现各个线程之间的等待问题,或是死锁问题】。

大多数时候客户端都在访问我们应用中的业务对象,为了减少并发控制,在这个时候我们不应该在业务对象中设置那些容易造成出错的成员变量(成员变量的解决方式:1、方法的参数局部变量(相当于new),2、threadlocal/2、设置bean的scope=prototype),在并发访问时候这些成员变量将会是并发线程中的共享对象,那么这个时候就会出现意外情况。

 

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

 

 

原文:https://blog.csdn.net/cs408/article/details/48972653

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值