使用場景:線程池對象
實現:
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;
}