Spring如何解决获取到不完整Bean的问题

直接上答案

双重检查锁,两个同步锁,两次检查一级缓存

问题分析

我们先明确一些东西,什么时候是bena的不完整的,就是说我们的Bean没有完整的生命周期,只是进行了初始化或者进行了初始化和属性赋值但是没有进行实例化的不完整的bean。

首先Spring是存在三级缓存的

  • 一级缓存:用来存储完整的bean
  • 二级缓存:用来存储初期的不完整的bean,只进行了初始化没有进行属性赋值和实例化的bena
  • 三级缓存:用来循环依赖的问题,是一个函数式接口,存放一个Bean的lambda表达式,刚实例化完的bean

Spring的解决方法

有两个线程同时访问BeanA,线程A比较快,先来访问BeanA,此时BeanA还不存在,线程A调用,getBean(A)方法,调用doGetBena(A),调用Getsingleton(A),去一级缓存二级缓存三级缓存里边都没有找到,开始创建BeanA,进行实例化,属性赋值,初始化放入一级缓存等一系列操作,这些操作Spring都是加了一把锁。 假设现在线程B进来获取BeanA,他也进行getBean(A)方法,调用doGetBena(A),调用Getsingleton(A),但是现在我们线程A在二级缓存和三级缓存加了锁,线程B现在是获取不到二级缓存和三级缓存的,处于堵塞状态, 当线程A创建完成BeanA时,删除二级缓存和三级缓存的数据,把完整的BeanA存储在一级缓存时,锁释放,然后线程B开始访问二级缓存,三级缓存,也没有访问到BeanA,线程B没有访问到BeanA,所以开始创建BeanA,在创建BeanA之前,他会再调用Getsingleton(A),去一级缓存里边拿BenaA,这时候拿到的就是完成的beanA,这就是两次检查一级缓存,从而解决了获取到不完成bean的问题。

相关推荐
canonical_entropy2 分钟前
XDef:一种面向演化的元模型及其构造哲学
后端
小林coding16 分钟前
再也不怕面试了!程序员 AI 面试练习神器终于上线了
前端·后端·面试
lypzcgf20 分钟前
Coze源码分析-资源库-删除插件-后端源码-错误处理与总结
人工智能·后端·go·coze·coze源码分析·ai应用平台·agent平台
文心快码BaiduComate28 分钟前
WAVE SUMMIT深度学习开发者大会2025举行 文心大模型X1.1发布
前端·后端·程序员
SamDeepThinking37 分钟前
在Windows 11上配置Cursor IDE进行Java开发
后端·ai编程·cursor
知其然亦知其所以然44 分钟前
面试官微笑发问:第100万页怎么查?我差点当场沉默…
后端·mysql·面试
文心快码BaiduComate1 小时前
文心快码升级至3.5S版本,强化多智能体自协同能力
前端·后端·程序员
即兴小索奇2 小时前
Google AI Mode 颠覆传统搜索方式,它是有很大可能的
前端·后端·架构
LucianaiB2 小时前
我用LazyLLM做了一个打工人述职Agent,朋友直呼打工人的福利,太完美了
后端
小蒜学长2 小时前
旅行社旅游管理系统的设计与实现(代码+数据库+LW)
java·数据库·spring boot·后端·旅游