美文网首页
单例模式

单例模式

作者: DominicHan | 来源:发表于2016-12-25 12:13 被阅读0次

    确保某个类有且只有一个对象,避免产生多个对象消耗过多的资源,或者某种类型的对象只应该有且只有一个。
    例如:创建一个对象需要消耗的资源过多,如要访问IO和数据库等资源,这时就要考虑使用单例。

    单例关键点:
    构造方法私有化
    静态方法或者枚举返回单例类对象
    多线程环境下确保类对象只有一个
    类对象在反序列化时不会重新构建对象

    实现方法:
    1.饿汉式

      public class Singleton {
           private static final Singleton mInstance = new Singleton();
           private Singleton() {}
           public static Singleton getInstance() {
                return mInstance;
           }
      }
    

    2.懒汉式
    synchronized关键字,同步锁,保证多线程情况下单例

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

    3.双重检查锁 DCL
    DCL能在需要时实例化对象,又能保证线程安全,且初始化实例后不再进入同步代码块
    volatile,它的意思是:被volatile修饰的变量的值,将不会被本地线程缓存,所有对该变量的读写都是直接操作共享内存,从而确保多个线程能正确的处理该变量。

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

    4.静态内部类

      public class Singleton {
           private Singleton() {}
           public static Singleton getInstance() {
                return SingletonHolder.mInstance;
           }
    
           private static class SingletonHolder {
                private static final Singleton mInstance = new Singleton();
           }
      }
    

    5.枚举

    public enum SingletonEnum {
        INSTANCE;
        public void doSomething() {
            ............
        }
    }
    

    Android中的应用:
    系统级别的服务,LayoutInflater等

    优点:
    减小内存开支,防止资源多重占用

    相关文章

      网友评论

          本文标题:单例模式

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