项目中用到的单例模式
- 静态内部类实现单例:推荐,线程安全以及延迟单例的实例化。
public class Singleton {
private Singleton(){}
//通过该方法获得实例对象
public static Singleton getSingleton(){
return SingletonHolder.singleton;
}
private static class SingletonHolder{
private static final Singleton singleton=new Singleton();
}
}
DCL (Double Check Lock)实现单例 (双重检验锁)
public class UserConfig {
private static UserConfig user;
private UserConfig(){}
public static UserConfig getInstance(){
if(user==null){
synchronized(UserConfig.class){
if(user==null){
user=new UserConfig();
}
}
}
return user;
}
}
第一层判断是为了避免不必要的同步,第二层判断为了在null的情况下创建实例。 但是由于
user=new UserConfig();
不是原子的,大致有以下三步:
- 1)给user的实例分配内存
- 2)调用user的构造函数,初始化成员变量
- 3)将INSTANCE对象指向分配的内存空间
private volatile static Singleton INSTANCE=null
就可以保证
单例每次都是从内存中读取。
DCL的优点:资源利用率高,第一次获取单例的时候才会实例化,效率高。缺点:第一次加载的时候反应稍慢,
也由于java内存模型的原因偶尔会失败。高并发环境下也有一定缺陷,虽然发生概率较小。 DCL是使用最多的单例模式。