最新公告
  • 新注册用户请前往个人中心绑定邮箱以便接收相关凭证邮件!!!点击前往个人中心
  • 设计模式之单例模式实践

    概念
    单例模式即一个JVM内存中只存在一个类的对象实例


    分类
    1、懒汉式
    类加载的时候就创建实例
    2、饿汉式
    使用的时候才创建实例

    当然还有其他的生成单例的方式,双重校验锁,枚举和静态内部类,文中会有介绍

    实践
    懒汉式
    1)线程不安全,不可用
    public class Singleton {  
        private static Singleton instance;  
        private Singleton (){}  
      
        public static Singleton getInstance() {  
        if (instance == null) {  
            instance = new Singleton();  
        }  
        return instance;  
        }  

    2)线程安全,同步方法,效率低,不推荐
    public class Singleton {  
        private static Singleton instance;  
        private Singleton (){}  
        public static synchronized Singleton getInstance() {  
        if (instance == null) {  
            instance = new Singleton();  
        }  
        return instance;  
        }  

    3)线程不安全,会产生多个实例,不可用
    public class Singleton {
        private static Singleton singleton;
    private Singleton() {}

        public static Singleton getInstance() {
            if (singleton == null) {
                synchronized (Singleton.class) {
                    singleton = new Singleton();
                }
            }
            return singleton;
        }
    }

    饿汉式,无线程安全问题,不能延迟加载,影响系统性能
    4)
    public class Singleton {  
        private static Singleton instance = new Singleton();  
        private Singleton (){}  
        public static Singleton getInstance() {  
    return instance;  
        }  

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

    6)双重校验锁,线程安全,推荐使用
    public class Singleton {
        private static volatile Singleton singleton;
        private Singleton() {}

        public static Singleton getInstance() {
            if (singleton == null) {
                synchronized (Singleton.class) {
                    if (singleton == null) {
                        singleton = new Singleton();
                    }
                }
            }
            return singleton;
        }

    7)静态内部类,线程安全,主动调用时才实例化,延迟加载效率高,推荐使用
    public class Singleton {  
        private static class SingletonHolder {  
    private static final Singleton INSTANCE = new Singleton();  
        }  
        private Singleton (){}  
        public static final Singleton getInstance() {  
    return SingletonHolder.INSTANCE;  
        }  

    8)枚举类型,无线程安全问题,避免反序列华创建新的实例,很少使用
    public enum Singleton {  
        INSTANCE;  
        public void whateverMethod() {  
        }  
    }

    注意事项
    1、考虑多线程问题
    2、单例类构造方法要设置为private类型禁止外界new创建
    private Singleton() {}
    3、如果类可序列化,考虑反序列化生成多个实例问题,解决方案如下
    private Object readResolve() throws ObjectStreamException {  
    // instead of the object we’re on, return the class variable INSTANCE  
    return INSTANCE;  
    }  

    使用场景
    1、工具类对象
    2、系统中只能存在一个实例的类
    3、创建频繁或又耗时耗资源且又经常用到的对象

    下面是单例模式在JDK的应用
    另外,spring容器中的实例默认是单例饿汉式类型的,即容器启动时就实例化bean到容器中,当然也可以设置懒汉式defalut-lazy-init=”true”为延迟实例化,用到时再实例化。
    本站所有文章均由网友分享,仅用于参考学习用,请勿直接转载,如有侵权,请联系网站客服删除相关文章。若由于商用引起版权纠纷,一切责任均由使用者承担
    极客文库 » 设计模式之单例模式实践

    常见问题FAQ

    如果资源链接失效了怎么办?
    本站用户分享的所有资源都有自动备份机制,如果资源链接失效,请联系本站客服QQ:2580505920更新资源地址。
    如果用户分享的资源与描述不符怎么办?
    可以联系客服QQ:2580505920,如果要求合理可以安排退款或者退赞助积分。
    如何分享个人资源获取赞助积分或其他奖励?
    本站用户可以分享自己的资源,但是必须保证资源没有侵权行为。点击个人中心,根据操作填写并上传即可。资源所获收益完全归属上传者,每周可申请提现一次。
    如果您发现了本资源有侵权行为怎么办?
    及时联系客服QQ:2580505920,核实予以删除。

    参与讨论

    • 211会员总数(位)
    • 3737资源总数(个)
    • 0本周发布(个)
    • 0 今日发布(个)
    • 869稳定运行(天)

    欢迎加入「极客文库」,成为原创作者从这里开始!

    立即加入 了解更多
    成为赞助用户享有更多特权立即升级