单例模式

单例模式
  • 适用于消耗资源过多的对象
  • 构造函数为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);
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 单例模式(SingletonPattern)一般被认为是最简单、最易理解的设计模式,也因为它的简洁易懂,是项目中最...
    成热了阅读 4,580评论 4 34
  • 前言 本文主要参考 那些年,我们一起写过的“单例模式”。 何为单例模式? 顾名思义,单例模式就是保证一个类仅有一个...
    tandeneck阅读 2,677评论 1 8
  • 1.单例模式概述 (1)引言 单例模式是应用最广的模式之一,也是23种设计模式中最基本的一个。本文旨在总结通过Ja...
    曹丰斌阅读 3,095评论 6 47
  • 一.什么是单例模式 单例模式的定义:确保一个类只有一个实例,并提供一个访问他的全局访问点。单例模式是几个设计模式中...
    Geeks_Liu阅读 2,370评论 0 10
  • 五月的天 25摄氏度 开着窗 小猫座在身旁 月华初上 晚风轻凉 夹杂着丁香花香 你侧脸很美 十年之后我才敢对你说的话
    星辰大海艾大米阅读 278评论 0 0

友情链接更多精彩内容