华为OD技术面真题 - JAVA开发- spring框架 - 7
文章目录Spring中单例Bean会存在线程安全吗如何保证单例Bean线程安全什么是循环依赖Spring可以解决哪些类型的循环依赖Spring是如何解决循环依赖的Spring中单例Bean会存在线程安全吗分情况分状态讨论创建spring容器会保证Bean创建过程中的线程安全。使用无状态的Bean是线程安全的。特点没有成员变量或者不被修改。方法只使用局部变量有状态的Bean。存在成员变量并且存在修改修改函数未加锁或其它同步操作。如何保证单例Bean线程安全出现线程安全的原因本质是多个线程同时并发读写同一份可变共享数据且没有任何同步控制。保证创建的Bean是无状态的。只读操作是线程安全使用ThreadLocal每个线程操作单独的副本或者将Singleton转换为Prototype。将共享转换为不共享加锁或者使用原子类/线程安全类。进行同步控制什么是循环依赖Spring可以解决哪些类型的循环依赖循环依赖多个对象之间相互依赖形成一个闭环。例如A-B-A以下一个例子为例Component class A { Autowired private B b; } Component class B { Autowired private A a; }可以自行解决的循环依赖类型A/B的对应属性采用setter方法注入A/B对应属性采用属性自动注入不可以解决的循环依赖的类型AB为多例BeanA/B对应属性都采用构造器注入A/B对应属性存在构造器注入(例如A类采用构造器注入B中采用属性/setter方法注入)Spring是如何解决循环依赖的Spring借助三级缓存机制解决循环依赖。spring中定义了三个缓存singletonObjects: 一级缓存用于存放完全初始化好的BeanearlySingletonObjects: 二级缓存用于存放提前暴露的beansingletonFactories:三级缓存用于存放Bean工厂。解决三级缓存解决缓存依赖的流程以A/B类为例实例化A此时A为空壳对象。放入三级缓存singletonFactoriesA进行输入注入发现依赖B对象。调用getSingleton(B)获取此时B还未创建会实例化B。实例化BB也放入三级缓存中。此时发现B需要A调用getSingleton(A)获取会命中三级缓存返回A的早期对象。将A早期对象放入二级缓存earlySingletonObjects删除三级缓存中的 A.B获取到A早期对象之后完成完整创建。放入一级缓存。此时回到AA获取到一级缓存中的BA初始化完成。A也放入一级缓存。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2497753.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!