关于Spring IOC 的 单例缓存池的一些想法

wuchangjian2021-11-03 01:49:48编程学习
    /** Cache of singleton objects: bean name to bean instance. */
	private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);

	/** Cache of singleton factories: bean name to ObjectFactory. */
	private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap<>(16);

	/** Cache of early singleton objects: bean name to bean instance. */
	private final Map<String, Object> earlySingletonObjects = new ConcurrentHashMap<>(16);

这是源码中对它的定义。

1. 是private修饰的,那么这个属性它将不能被子类访问到。

2.使用了singleObjects。

     从源码中我们可以看到对singletonObjects的修改都会有synchronized 代码块来修饰,那么为什么还需要用 ConcurrentHashMap呢?

针对这个问题进行了如下思考:

1. 虽然是private修饰的但是依然可以通过getBean等方法访问到。子类在使用的过程中使用多线程技术就可能出现并发访问。

2. 如果在多线程的情况下,其中的键值对就会出现可见性问题。如果通过HashMap来存储,A线程put了新的键值对时,B线程对这个值可能是不可见的,而ConcurrentHashMap中的K V 是用volatile修饰的,解决了可见性的问题。   这里ConcurrentHashMap作用更多的是体现在可见性上。

那么问题又来了

单例缓存池的第三层

它怎么就不用ConcurrentHashMap了呢?

未完待续

================================================================

记录一个只知道背单例创建的小白被面试官难倒的亡羊补牢

相关文章

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。