美文网首页
设计模式-单例模式

设计模式-单例模式

作者: liuzhimi | 来源:发表于2019-04-09 16:50 被阅读0次

    介绍

    单例模式确保某一个类只有一个实例,而且自行实例化。
    主要解决:一个全局使用的类频繁地创建与销毁。
    使用场景:需要控制实例数目并且节省系统资源的时候。
    优点

    • 内存中只有一个实例,减少内存开销(在频繁创建销毁实例的程序中得到很好的应用)
    • 避免对资源的多重占用

    UML类图

    • Main:客户端
    • SingleObject: 单例类

    实现单例模式关键点

    • 构造函数私有
    • 确保单例类对象有且仅有一个,尤其是在多线程环境下

    代码实现

    以下实现均线程安全。

    饿汉式

    `public class SingleObject {
        private static SingleObject instance = new SingleObject();
        private SingleObject() {}
        
        public static SingleObject getInstance() {
            return instance;
        }
    }
    

    优点:没有加锁,效率会提高
    缺点:类加载时就初始化,浪费内存;

    懒汉式

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

    优点:懒汉模式在第一次调用才初始化,避免了内存浪费。
    缺点:使用synchronized关键字添加了方法锁,每次调用getInstance()方法都会进行同步,降低了效率;

    DCL(Double Check Lock)

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

    优点:能够在需要时才初始化单例;线程安全且初始化后再调用getInstance()方法不进行同步锁。
    缺点:第一次加载时稍慢。

    静态内部类

    public class SingleObject {
        private SingleObject() {}
        
        public static SingleObject getInstance() {
            return SingleHolder.sIntance;
        }
        
        private static class SingleHolder {
            private static final SingleObject sIntance = new SingleObject();
        }
    }
    

    只有再第一次调用getInstance()方法时才会导致sIntance被初始化。
    原理:利用classloader机制来保证初始化instance只有一个线程。

    枚举

    public enum SingleObject {
        INSTANCE;
        public void method() {}
    }
    

    枚举实例的创建线程安全的,并且即使反序列化也不会重新生成新的实例。

    相关文章

      网友评论

          本文标题:设计模式-单例模式

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