Java 单例模式 解析

86 阅读1分钟
  • 单例模式实现思路
  1. 某个类只能有一个实例
  2. 必须自行创建实例
  3. 必须向整体系统对外提供这个唯一的实例
  • 实现
  1. 私有化构造方法
  2. 含有此类的静态私有对象
  3. 提供一个静态公有方法用于创建 获取静态私有对象
  • 饿汉式(对象创建的时候实例化 空间换时间)
public class Singleton{
  // 私有化构造方法
  private Singleton(){}
  // 静态实例实例化
  private static SingletonOne INSTANCE = new Singleton();、
  // 返回实例
  public static Singleton getInstance(){
    return INSTANCE;
  }
}
  • 懒汉式(调用的时候才实例化 时间换空间 存在线程风险)
public class Singleton{
  private Singleton(){}
  private static Singleton INSTANCE = null;
  public static Singleton getInstance(){
    if(INSTANCE == null){
      INSTANCE = new Singleton();
    }
    return INSTANCE;
  }
}
  • 静态内部类实现线程安全的懒汉模式
    • 外部类加载时并不需要立即加载内部类,内部类不被加载则不去初始化INSTANCE,故而不占内存。即当SingleTon第一次被加载时,并不需要去加载SingleTonHoler,只有当getInstance()方法第一次被调用时,才会去初始化INSTANCE,第一次调用getInstance()方法会导致虚拟机加载SingleTonHoler类,这种方法不仅能确保线程安全,也能保证单例的唯一性,同时也延迟了单例的实例化。
public class Singleton{
  private Singleton(){}
  private static class SingletonHolder{
     private static Singleton INSTANCE = new Singleton();
  }
   public static Singleton getInstance(){
     return SingletonHolder.INSTANCE;
  }
}
  • 双重校验锁实现线程安全的懒汉模式
    • 对Instance使用volatile修饰即可,可以禁止指令重排序
    • 双重判断 防止重复拿锁
public class Singleton{
  private Singleton(){}
  private static volatile Singleton INSTANCE = null;
  private static Singleton getInstance(){
    if(INSTANCE == null){
        synchronized(Singleton.class){
          if(INSTANCE == null){
            INSTANCE = new Singleton();
          }
        }
    }
    return INSTANCE;
  }
}