Spring中Bean是线程安全的么?今天面试这个问题没有回答好,所以准备好好总结一下Spring 的Bean的线程安全问题
是不安全的,Spring中Bean没有线程安全策略,从Bean的Scope来看,主要有singleton,prototype,request,session,global-session,主要看单例模式,和原型模式
- 在原型模式中,每次使用Bean都会创建一个新的对象,自然就不存在线程安全问题,(如果该Bean注入了单例bean,还是需要考虑内部的单例Bean对象的线程安全问题!)
- 在单例模式中,IoC容器中只有一个对象,所有线程公用一个对象,如果当前Bean是无状态的,即对成员的 *** 作只有访问,没有修改,那就不存在线程安全问题,SpringMVC的controller,service,mapper,dao等类基本都是无状态,因为只是调用方法。(调用方法时会在自己线程的工作内存复制需要的变量,没有线程安全问题),但是如果涉及对成员变量的修改就会发生线程安全问题。
可以解决成员变量的线程安全问题,但是无法解决类变量的线程安全问题,因为类变量在类实例之前是共享的。
除了类变量,还有在这个Bean中注入其他的Bean,如果内部的Bean是单例的,且需要修改它的属性,还是会引发线程安全问题
-
线程同步机制(时间换空间)
使用线程安全类,对成员的修改 *** 作方法加锁,保证各个线程对临界资源的访问是分开的,当然可以加读写锁来提高并发度 -
使用ThreadLocal(空间换时间)
ThreadLocal内的变量是线程安全的,因为每个线程在获取ThreadLocal对象时只能获取到自己的ThreadLocal。
至于ThreadLocal的原理,之后再叙述!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)