设计单例模式:
单例设计模式主要有两点:
1.延迟初始化,当具体使用时,才实例化对象
2.多线程安全 多线程情况下保证对象是单例的
具体实现方式主要有以下两种:
1.双重检查加锁机制
public class Singleton {
private static volatile Singleton s;
//私有构造方法
private Singleton(){}
//双重检查加锁
public static Singleton getSingleton(){
if(s==null){
synchronized (Singleton.class) {
if(s==null){
//new Singleton() 若不加锁,则此步骤容易发生指令重排序
s = new Singleton();
}
}
}
return s;
}
}
2.静态内部类
public class Singleton {
//私有构造方法
private Singleton(){}
//双重检查加锁
public static Singleton getSingleton(){
return InnerSingleton.s;
}
private static class InnerSingleton{
private static Singleton s = new Singleton();
}
}
Spring中单例模式的使用:
AbstractBeanFactory类getBean方法
DefaultSingletonBeanRegistry类中,单例缓存
private final Map<String, Object> singletonObjects = new ConcurrentHashMap<String, Object>(64);
如果缓存中有从缓存中取,若没有则使用创建工厂来创建其中单例缓存,单例创建工厂缓存,早期单例缓存(主要解决循环依赖)
可有不同的ObjectFactory来产生不同类型的Bean