美文网首页
3 创建型之单例模式

3 创建型之单例模式

作者: Laken | 来源:发表于2019-01-17 11:09 被阅读0次

    概念

    保证一个类只有一个实例,并且提供一个全局访问点。

    实现

    饿汉式:类加载时就创建实例。

    public static Singleton{
      private Singleton(){}
      private static Singleton slt = new Singleton();
      public static getSingleton(){
        return slt;
      }
    }
    

    懒汉模式:调用时才创建实例。

    public static Singleton{
      private Singleton(){}
      private static Singleton slt;
      public static getSingleton(){
        if(slt == null){
          slt = new Singleton();
        }
        return slt;
      }
    }
    

    以上两种模式均没有考虑到多线程的情况。
    双重检查:懒汉模式的线程安全版。

    public static Singleton{
      private Singleton(){}
      private static volatile Singleton slt;
      public static getSingleton(){
        if(slt == null){
          synchronized(Singleton.class){
            if(slt == null){
              slt = new Singleton();
            }
          }
        }
        return slt;
      }
    }
    

    volatile关键字的一个重要作用是禁止指令重排序,即保证不会出现内存分配、返回对象引用、初始化这样的顺序,避免了一个线程执行了new操作返回了对象引用,但还没有初始化的时候,另一个线程直接使用了这个实例造成的异常。

    枚举类:还能防止反序列化时重新创建新的对象。
    public enum Singleton{
      INSTANCE;
    }
    

    适用性

    • 一个类只能存在一个实例,并且提供一个公共的方法使客户端能获取这个实例。
    • 如果需要添加新的方法,应该重新编写新的类来实现,而不是扩展此类。

    真实案例

    相关文章

      网友评论

          本文标题:3 创建型之单例模式

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