单例模式(Singleton)

作者: 奔跑的图腾 | 来源:发表于2018-03-28 17:26 被阅读0次

    单例模式的特点

    1. 单例模式只能有一个实例。
    2. 单例类必须创建自己的唯一实例。
    3. 单例类必须向其他对象提供这一实例

    应用场景

    某个对象频繁被访问使用

    主要有五种实现方式,懒汉式(延迟加载,使用时初始化),饿汉式(声明时初始化),双重检查,静态内部类,枚举

    实现要点
    声明为private来隐藏构造器
    private static Singleton实例
    声明为public来暴露实例获取方法

    1.懒汉式,线程不安全的实现

        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;
        }
    }
    //由于对象只需要在初次初始化时需要同步,多数情况下不需要互斥的获得对象,加锁会造成巨大无意义的资源消耗
    

    2.饿汉式
    instance在类加载时进行初始化,避免了同步问题。饿汉式的优势在于实现简单,劣势在于不是懒加载模式(lazy initialization)在需要实例之前就完成了初始化,在单例较多的情况下,会造成内存占用,加载速度慢问题 由于在调用getInstance()之前就完成了初始化,如果需要给getInstance()函数传入参数,将会无法实现

    public class Singleton {
        private static final Singleton instance = new Singleton();
        private Singleton() {
        };
        public static Singleton getInstance() {
            return instance;
        }
    }  
    

    3.双重检查锁定(double checked locking pattern)

    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();
                    }
                }
            }
            return instance;
        }
    }
    

    4.静态内部类
    优点:延迟加载,线程安全,内存消耗少(推荐使用)

    public class Singleton {
        private Singleton() {
        };
        public static Singleton getInstance() {
            return Holder.instance;
        }
        private static class Holder{
            private static Singleton instance = new Singleton();
        }
    }  
    

    5.枚举

    相关文章

      网友评论

        本文标题:单例模式(Singleton)

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