单例模式是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有关,现在的我还不是很理解。
网友评论