美文网首页
Android设计模式——单例模式

Android设计模式——单例模式

作者: 李die喋 | 来源:发表于2019-10-04 22:44 被阅读0次

单例模式是android面试中最常问的一种设计模式,听学姐说面试官曾让他手撕单例模式,可见其重要性,他也是我们写代码时候的最常用的一种设计模式。

懒汉模式

public class Singleton{
    private static Singleton instance;
    
    public Singleton(){}
    
    public static synchronized Singleton getInstance(){
        if(instance == null){
            instace = new SingleTon;
        }
        return instance;
    }
}

懒汉模式采用的是静态同步方法的形式,锁住的是Singleton.class对象。它的优点是在多个变量需要实例化时,保证了他们的依次执行。缺点是锁住的是整个代码块,只要遇到synchronized就停下等待造成不必要的同步开销。

Double Check Lock(双重锁模式)

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

双重锁模式采用的是同步代码块的形式,和懒汉模式的想法相同,不同的是双重锁模式将锁放在了方法内,且避免了不必要的同步,算是对懒汉模式的一种改进。

  • 第一个instance避免了不必要的同步
  • 第二个instance是判空

静态内部类单例模式

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

当第一次加载Singleton类时并不会初始化sInstance,只有在第一次调用Singleton的getInstance方法时才会导致sInstance被初始化。因此,第一次调用getInstance方法会导致虚拟机加载SingletonHolder类,这种方式能够确保线程安全,保证了单例对象的唯一性,延迟了单例的实例化。

这个方法是《Android设计模式》一书中推荐的方法,我不太理解的在实例化Singleton类的时候,不会实例化sInstance,带static关键字的变量是什么时候被初始化的,可能与jvm有关,现在的我还不是很理解。

相关文章

网友评论

      本文标题:Android设计模式——单例模式

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