请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

在12:50秒对于移除三级缓存的解释有疑问

//将实例放入二级缓存里
this.earlySingletonObjects.put(beanName, singletonObject);
//从三级缓存里移除
this.singletonFactories.remove(beanName);

老师,我的看法是(我没有去仔细再看源码,仅仅是从您的讲解中,有些疑问) : 最上面两行代码“是从三级缓存移除该bean,只在二级缓存中保存该bean实例”,这个我能理解。我有疑问的地方是您说防止通过singletonFactory去重复创建bean实例。第一行代码已经放到二级缓存了,就表示下次在二级缓存可以拿到这个bean实例。此时

//如果还没有获取到并且第二个参数为true,为true则表示bean允许被循环引用
	if (singletonObject == null && allowEarlyReference) {
//从三级缓存singletonFactories这个ObjectFactory实例的缓存里尝试获取创建此Bean的单例工厂实例}

这段代码它根本进不来啊,就是说它不会去找三级缓存了,所以不存在重复创建的说法啊。想问下这里是还有什么逻辑没讲完全,还是我理解有误。

正在回答

1回答

同学好,三级缓存的创建逻辑得以执行的前提是singletonObject == null && allowEarlyReference

而singletonObject一旦被赋值,那么就不会在三级缓存进行创建,所以在第二缓存里面singletonObject一旦不为空,则不执行三级缓存的创建,也就是不存在重复创建了。

1 回复 有任何疑惑可以回复我~
  • 提问者 慕哥6062902 #1
    明白你想表达的意思了,谢谢!有时候太一字一句去听,反而容易陷进去
    回复 有任何疑惑可以回复我~ 2020-06-25 07:44:35
  • 提问者 慕哥6062902 #2
    主要是您讲的几乎没一句是废话,有时候有些讲解我理解起来感觉很困难,就想跳过去,等把后面的听了再说,可其实还是得回过来重复听,这样才能有个大致的理解。想请教下有没有效率高点的学习这课程的方式,还是说本来就应该是这个过程呢,多谢老师
    回复 有任何疑惑可以回复我~ 2020-06-25 10:21:17
  • 翔仔 回复 提问者 慕哥6062902 #3
    慕哥好,推荐的学习方式是先不管,一股劲往后学,之后再回来看,反复理解,这样效果好些,因为课程里面我会前后强调同一个知识点的,所以好理解些,学习源码确实需要花些精力,但是跟着课程效率会高:)
    回复 有任何疑惑可以回复我~ 2020-06-26 00:24:06
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信