美文网首页
单例模式

单例模式

作者: cy_why | 来源:发表于2017-08-03 21:05 被阅读14次
单例模式
  • 适用于消耗资源过多的对象
  • 构造函数为private
  • 通过一个静态方法或枚举返回单例类的对象
  • 确保单例类的对象只有一个
饿汉单例模式
  • 声明静态对象的时候已经初始化了
public class A{
    private static final A a = new A();
    private A(){}
    public static A getInstance(){
        return a;
    }
}
懒汉模式
public class A{
    private static final A a;
    private A(){}
    public static synchronized A getInstance(){
        if(a == null){
            a = new A();
        }
    }
}
  • 能够保证在多线程情况下单例对象的唯一性,但是第一次加载的时候需要及时的实例化,反应稍慢,而且每次调用方法的时候都会进行同步synchronized,造成不必要的开销。
Double Check Lock(DCL模式)
  • 既能够在需要的时候才开始实例化,又能保证线程安全,而且对象初始化后再次调用不进行同步锁。
public class A{
    private static A a = null;
    private A(){}
    public static A getInstance(){
        if (a == null){
            synchronized(A.class){
               if(a == null){
                   a = new A();
               }
            }
          }
          return a;
    }
}
静态内部类单例模式
  • DCL 模式在某些情况下会出现失效的问题,称双重检查锁定(DCL)失效。使用静态内部类,能够保证线程安全,也能保证线程对象的唯一性,同时也延时加载了单例的实例化。推荐使用。
public class A{
    private A(){}
    public static A getInstance(){
        return AHolder.instance;
    }
    private static class AHolder{
        private static final A instance = new A();
    }
}
枚举单例
public enum A{
   INSTANCE;
   public void doSomething(){
       System.out.println("");
   }
}
  • 默认枚举实例的创建是线程安全的,并且在任何情况下它都是一个单例。
  • 以上的单例模式,在反序列化的时候都可能会出现,重新创建对象的情况,需要加入以下的方法
private Object readResolve() throws ObjectStreamException{
    return instance;
}
  • 而对于枚举,并不存在此问题。
使用容器实现单例模式
public class A{
    private static Map<String,Object> objectMap = new HashMap<String,Object>();
    private A(){}
    public static void registerService(String key,Object instance){
        if(!objectMap.containsKey(key)){
            objectMap.put(key,instance);
        }
     }
    public static Object getService(String key){
        return objectMap.get(key);
    }
}

相关文章

  • 【设计模式】单例模式

    单例模式 常用单例模式: 懒汉单例模式: 静态内部类单例模式: Android Application 中使用单例模式:

  • Android设计模式总结

    单例模式:饿汉单例模式://饿汉单例模式 懒汉单例模式: Double CheckLock(DCL)实现单例 Bu...

  • 2018-04-08php实战设计模式

    一、单例模式 单例模式是最经典的设计模式之一,到底什么是单例?单例模式适用场景是什么?单例模式如何设计?php中单...

  • 设计模式之单例模式详解

    设计模式之单例模式详解 单例模式写法大全,也许有你不知道的写法 导航 引言 什么是单例? 单例模式作用 单例模式的...

  • Telegram开源项目之单例模式

    NotificationCenter的单例模式 NotificationCenter的单例模式分析 这种单例模式是...

  • 单例模式Java篇

    单例设计模式- 饿汉式 单例设计模式 - 懒汉式 单例设计模式 - 懒汉式 - 多线程并发 单例设计模式 - 懒汉...

  • IOS单例模式的底层原理

    单例介绍 本文源码下载地址 1.什么是单例 说到单例首先要提到单例模式,因为单例模式是单例存在的目的 单例模式是一...

  • 单例

    iOS单例模式iOS之单例模式初探iOS单例详解

  • 单例模式

    单例模式1 单例模式2

  • java的单例模式

    饿汉单例模式 懒汉单例模式

网友评论

      本文标题:单例模式

      本文链接:https://www.haomeiwen.com/subject/ztqmlxtx.html