枚举的方法《极其不推荐》
这是网上很多人推荐的一种做法,但是貌似使用的不广泛,大家可以试试,还有就是enum在android 中是不常使用的;
内部类的实现
内部类是一种好的实现方式,可以推荐使用一下:
调用:
优点:延迟加载,线程安全(java中class加载时互斥的),也减少了内存消耗
Double CheckLock(DCL)实现单例:
/** * Created by xiaoming on 2017/2/13 */ public class Singleton { //私有的属性 private static Singleton sInstance = null; //私有的构造方法 private Singleton() { } //对外暴露的业务方法 public void doSomething() { System.out.print("do.something"); } /*** * 对外暴露的创建实例的方法 * 至于为什么两次判定,第一次主要是为了不必要的同步,第二次视为了在为null的时候创建出实例 * * @return */ public static Singleton getInstance() { if (sInstance == null) { synchronized (Singleton.class) { if (sInstance == null) { sInstance = new Singleton(); } } } return sInstance; } }
DCL的优点:资源利用率高,第一次执行getInstance()时单例对象才会被实例化,效率高。缺点:第一次加载的时候反应稍慢,也会由于java的内存模型的原因会偶尔失败。在高并发的情况下也有一定的缺陷,虽然发生的概率很小。DCL模式是使用最多的单例模式,它能够在需要时才实例化对象并且在绝大多数的情况下保证单例对象的唯一性。
极其推荐的单例模式:<静态内部类单例模式>
public class Singleton { //私有的构造方法 private Singleton() { } public static Singleton getInstance() { return SingletonHolder.sInstance; } /*** * 静态内部类 */ private static class SingletonHolder { private static final Singleton sInstance = new Singleton(); } }