美文网首页
单例模式

单例模式

作者: 汇源可乐 | 来源:发表于2019-11-05 13:54 被阅读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也有使用单例模式,学习好设计模式是能读懂各种源码的基本要求。

    引用来源

    相关文章

      网友评论

          本文标题:单例模式

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