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就可以在多线程中共享了。