spring循环依赖
2024-09-06 14:56:42 0 举报
spring循环依赖
作者其他创作
大纲/内容
NO
return
这里会阻塞,直到线程1走完线程1走完二三级缓存都没了最后return null
No
return BeanA
1、getBean(B)
调用获取对象放到二级缓存
一级缓存
6.实例化(createBeanInstance)
加入三级缓存
1、getBean(A)
return null
8.初始化(initializeBean)
7.属性赋值(populateBean)
2.doGetBean(A)
这里我们需要思考一下,这里是两个互斥锁,我们想如果服务器启动的时候,他是单线程来执行就不会有问题,如果一个对象是懒加载,服务器启动起来,两个线程通知来获取对象的时候,就会有并发问题,这里的互斥可以解决并发问题。大家想如果不互斥的话,第一个线程创建出对象此时只是放到三级缓存,后第二个线程来获取这个对象,他会从三级缓存中获取对象工厂,然后调用得到对象,放到二级缓存后返回,而这个对象是不能用的,因为线程一还没有将这个对象的属性赋值,所以就会出现问题
这里我们用A代表RoleService
addSingleton(A)add到一级缓存remove二三级缓存
doCreateBean
返回B
singletanObjects.get(beanName);
线程1
二级缓存
此时一级缓存种已经有了
1.getBean(A)
发现依赖A
三级缓存
返回给B
createBeandocreateBean实例化.属性赋值
return BeanB
—级缓存
add到一级缓存remove 二三级缓存
2.doGetBean(B)
A
发现依赖B
在此期间第二个线程进来getBean(A)
此时二三级缓存都没了锁才释放
多线程在创建时怎么避免获取到不完整Bean
我们用B代替UserService
2、doGetBean(A)
线程2
0 条评论
回复 删除
下一页