Spring中的Bean是线程安全的吗?为什么?
答案:不是。
因此,在大多数情况下,spring bean是非线程安全的,或者说,如果你不告诉它如何管理对象或方法的线程安全,那么就会潜在线程安全问题。
但实际上,大部分的Spring bean并没有可变的状态(比如Serview类和DAO类),所以在某种程度上说Spring的单例bean是线程安全的。 如果你的bean有多种状态的话(比如 View Model 对象),就需要自行保证线程安全。
spring中的bean是单例的吗?
简单地讲,bean就是由Spring容器初始化、装配及管理的对象,除此之外,bean就与应用程序中的其他对象没有什么区别了。 而bean定义以及bean相互间的依赖关系将通过配置元数据来描述。
默认的是单例的,如果不想单例需要如下配置:bean id=user class=... singleton=false/singleton就是配置这个bean是否是单例的,如果不写,就是默认值true。
应该是单位的吧,因为单位的形式比较多,所以说它产生的数量会更多。
spring中创建bean对象时多例和单例的区别
非单例是每次调用都生成一个新的bean,所以第二次调用时,第一次的bean生命周期自动结束,所以spring不用进行管理,任其自生自灭。
多例 整个程序运行过程中只存在多个实例对象。每次使用的时候基本都是new出来的。spring依赖注入默认使用的是单例。如果类中存在有状态的变量,那么一般建议使用多例。因为单例的话 再并发的场景下数据会相互干扰。
单例模式和多例模式属于对象模式。 单例模式的对象在整个系统中只有一份,多例模式可以有多个实例。 它们都不对外提供构造方法,即构造方法都为私有。
spring的bean一般是单例模式,那多线程是怎么解决的
多线程跟单例模式不冲突啊,同时有多个请求用到了一个spring的bean,没毛病啊。
就是因为Spring对一些Bean(如RequestContextHolder、TransactionSynchronizationManager、LocaleContextHolder等)中非线程安全状态采用ThreadLocal进行处理,让它们也成为线程安全的状态,因为有状态的Bean就可以在多线程中共享了。
spring里的threadlocal一般都是用在数据库连接上的吧,这是为了可以重写threadlocal的get方法保证每个线程可以获得同一个连接。不是每个对象都用到threadlocal。
所以在某种程度上说Spring的单例bean是线程安全的。 如果你的bean有多种状态的话(比如 View Model 对象),就需要自行保证线程安全。