【原理】单例模式

使用场景:线程池对象

实现:

1、饿汉式

2、懒汉式 -> synchronized锁

3、静态内部类实现延迟初始化 -> 静态内部类特性

4、枚举 -> Effective Java

5、双重检查锁+volatile -> 指令重排序问题

6、反序列化破坏单例 ->  readObject();

7、多个类加载器破坏单例 -> 类加载原理

8、Spring如何创建单例 -> AbstractBeanFactory类getSingleton()方法

/**
 * Return the (raw) singleton object registered under the given name.
 * <p>Checks already instantiated singletons and also allows for an early
 * reference to a currently created singleton (resolving a circular reference).
 * @param beanName the name of the bean to look for
 * @param allowEarlyReference whether early references should be created or not
 * @return the registered singleton object, or {@code null} if none found
 */
@Nullable
protected Object getSingleton(String beanName, boolean allowEarlyReference) {
    Object singletonObject = this.singletonObjects.get(beanName);
    if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) {
        synchronized (this.singletonObjects) {
            singletonObject = this.earlySingletonObjects.get(beanName);
            if (singletonObject == null && allowEarlyReference) {
                ObjectFactory<?> singletonFactory = this.singletonFactories.get(beanName);
                if (singletonFactory != null) {
                    singletonObject = singletonFactory.getObject();
                    this.earlySingletonObjects.put(beanName, singletonObject);
                    this.singletonFactories.remove(beanName);
                }
            }
        }
    }
    return singletonObject;
}
发布了22 篇原创文章 · 获赞 11 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/t1g2q3/article/details/90234577