spring容器中的线程是否安全,容器本身并没有提供Bean的线程安全策略,因此可以说spring容器中的bean本身并不具备安全的特性,但是具体还是要结合具体scope的bean去研究。
spring的bean作用域(Scope)类型:
1.singleton:单例,默认作用域。
2.prototype:原型,每次创建一个新对象。
3.request:请求,每次http请求创建一个新对象,适合与webApplicationContext环境下。
4.session:会话,同一个会话共享一个实例,不同会话使用不同实例。
5.global-session:全局会话,所有会话共享一个实例。
线程安全这个问题,要从单例与原型bean分别进行说明:
原型Bean:
每次创建一个新对象,也就是线程之间并不存在bean共享,自然是不会有线程安全问题。
单例bean:
对于单例bean,所有线程都共享一个单例实例bean,因此存在资源的竞争。
如果单例bean,是一个无状态的bean,也就是线程中操作不会对bean的成员执行查询以外的操作。那么这个单例是线程全区的。比如Spring mvc 的Controller,Serverce,Dao等,这些bean 大多是无状态的,只关注方法本身。
如何保证线程安全?Spring中默认是单例模式的,框架中并没有对bean进行多线程的封装处理。实际上bean大部分时间是无状态的(比如dao),所以说某种程度上来说bean其实是线程安全的。
但如果bean是有状态的,那就需要开发人员自己来进行线程安全的保证,最简单的办法就是改变作用域singleTon改为prototype这样每次请求bean就相当于是new Bean() 这样就可以保证线程的安全了。
-有状态就是有数据存储功能
-无状态就是不会保存数据
controller、service和dao本身并不是线程安全的,如果只是调用里面的方法,而且多线程调用一个实例的方法,会在内存中复制变量,这是自己的线程的工作内存,是安全的。