单例模式
2019-11-05 本文已影响0人
汇源可乐
单例模式的6种写法:
饿汉模式,懒汉模式(线程不安全),懒汉模式(线程安全),双重检查模式(DCL),静态内部类模式,枚举单例
饿汉模式
public class Singleton
{
private static Singleton instance=new Singleton();
private Singleton(){}
public static Singleton getInstance()
{
return instance;
}
}
懒汉模式(线程不安全)
public class Singleton
{
private static Singleton instance;
private Singleton(){}
public static Singleton getInstance()
{
if(instance==null)
instance=new Singleton();
return instance;
}
}
懒汉模式(线程安全)
public class Singleton
{
private static Singleton instance;
private Singleton(){}
public static synchronized Singleton getInstance()
{
if(instance==null)
instance=new Singleton();
return instance;
}
}
双重检查模式
public class Singleton
{
private static volatile Singleton instance;
private Singleton(){}
public static Singleton getInstance()
{
if(instance==null)
{
synchronized(Singleton.class)
{
if(instance==null)
{
instance=new Singleton();
}
}
}
return instance;
}
}
两次检查的作用:第一次,通过检查类对象是否为空来减少进入同步的次数,
第二次检查:只有类对象为空的时候才会进入检查,这样用同步关键字来保证多线程时类对象只会被创建一次
静态内部类
public class Singleton
{
private Singleton(){}
public static Singleton getInstance()
{
return SingletonHolder.instance;
}
private static class SingletonHolder{
private static final Singleton instance=new Singleton();
}
}
枚举单例
public enum Singleton{
INSTANCE;
public void doSomething()
{
}
}
上述单例的实现模式,会在反序列化的时候重新创建对象。{将一个单例实例对象写到磁盘再都回来,从而得到一个实例}
杜绝反序列化时对象宠幸创建的解决方法:
private Object readResolve() throws ObjectStreamException{
return singleton;
}
单例模式在安卓的许多源码中都有所体现,通常使用的是DCL这种方式来构造单例模式,比如在EventBus事件中,就是用了DCL的单例模式,而使用各种模式最多的开源网络框架Retrofit也有使用单例模式,学习好设计模式是能读懂各种源码的基本要求。