Spring中Bean的线程安全问题

Spring中Bean的线程安全问题,第1张

Spring中Bean的线程安全问题?

今天面试这个问题没有回答好,所以准备好好总结一下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,如果内部的Bean是单例的,且需要修改它的属性,还是会引发线程安全问题

如果控制Bean来达到线程安全?
  1. 线程同步机制(时间换空间)
    使用线程安全类,对成员的修改 *** 作方法加锁,保证各个线程对临界资源的访问是分开的,当然可以加读写锁来提高并发度

  2. 使用ThreadLocal(空间换时间)
    ThreadLocal内的变量是线程安全的,因为每个线程在获取ThreadLocal对象时只能获取到自己的ThreadLocal。
    至于ThreadLocal的原理,之后再叙述!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/735827.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-27
下一篇 2022-04-27

发表评论

登录后才能评论

评论列表(0条)

保存