单例模式

2016-12-25  本文已影响0人  DominicHan

确保某个类有且只有一个对象,避免产生多个对象消耗过多的资源,或者某种类型的对象只应该有且只有一个。
例如:创建一个对象需要消耗的资源过多,如要访问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等

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

上一篇下一篇

猜你喜欢

热点阅读