spring面试题4( 2021-12-16)

本文介绍了Spring如何通过双重检查锁解决并发环境下获取不完整Bean的问题。在并发情况下,Spring使用锁机制确保Bean的完整创建,防止线程间获取未初始化的Bean。同时解释了为何不将一级缓存锁定,以优化性能。
摘要由CSDN通过智能技术生成

2021-12-16积累

26、Spring是如何帮助我们在并发下避免获取不完整的Bean?【阿里面试题】

搞清楚概念:

1、什么是不完整的bean?

是在实例化之后,已经有一个bean的实例了,获取的bean是不完整的,因为此时没有进行属性赋值,里面依赖注入的属性值为null且没有进行初始化的话,没有进行生命周期的回调,如果实现了AOP,会在初始化的时候创建代理对象,初始化之前的bean,并没有创建动态代理对象。

2、怎么样才算并发情况下获取bean呢?

有两个线程同时去获取BeanA。

线程1以微弱的优势先进来,发现123级缓存都没有,所以只能去实例化BeanA,并且将实例化之后的BeanA加入到三级缓存里面。这个时候线程2以微弱的劣势进来,同样先去123级缓存拿,发现三级缓存中存在BeanA。所以这个时候就拿到了不完整的BeanA。
【Spring已经解决了并发情况下获取的不完整的Bean】

通过双重检查锁来解决的。

两个同步锁,两次检查一级缓存是否有。

解释:

1、首先线程1以微弱的优势进来,getBean(A),doGetBean(A),getSingleton(A,boolean)。

这个时候会加一把锁。线程1开始创建BeanA。

线程1在创建BeanA的整个过程全部加了锁,从getSingleton(A,objectFactory),createBean(),doCreateBean(),实例化,属性赋值…将BeanA添加进一级缓存

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值