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添加进一级缓存