单例模式

关键点: 构造函数不对外开放,一般为private 通过一个静态方法或枚举对象返回单例类对象 确保单例类的对象只有一个,尤其在多线程模式下 确保单例类在反序列化时不会重新构造对象 必须保证线程安全 应用场景: 类 占用资源过多不宜创建多个实例,比如IO操作和数据库访问等

饿汉模式

在类首次加载到内存的时候就被初始化,不管是否使用都会初始化

public class Singleton{
     private static final  Singleton instance = new  Singleton();

     public static  Singleton getInstance(){
          return instance;
     }
}

懒汉模式

首次使用时被初始化,每次调用都会进行同步,会消耗不必要的资源,造成不必要的同步开销

public class Singleton{
     private static  Singleton instance=null;
     public static synchronized  Singleton  getInstance(){
          if(instance==null){
           instance=new  Singleton();
          }
               return instance;
     }
}

Double Check Lock(DCL)(推荐使用)

优点:资源利用率高,效率高 缺点:高并发的环境下小概率发生,第一次加载略慢,jdk1.5版本一下无法确保顺序

public class Singleton{
     private static  Singleton instance=null;
     public ststic Singleton  getInstance(){
          if(instance==null){
            synchronized ( Singleton .class){
              if( instance==null )instance=new  Singleton();
             }
          }
       return instance;
     }
}

静态内部类单例模式(推荐使用)

适用场景,构造函数无参数

public class Singleton{
      public ststic Singleton  getInstance(){ //第一次调用 Singleton类时不会加载,只有在 getInstance调用时才会初始化,线程安全,同时延迟了单例的实例化
      return  SingletonHolder.instance;
     }
     private static class  SingletonHolder{//静态内部类
      private static final  Singleton instance = new  Singleton();
     }
}