• 学习单例模式问题总结整理


    1、总结每种单例写法的优、缺点

    单例类型

    优点

    缺点

    饿汉式单例

    可以快速创建实例

    在未使用时就初始化实例,占用内存空间

    懒汉式单例

    只有在使用的时候,才会创建

    需要考虑多线程的安全问题,需要进行双重校验保证实例只被创建一次。但是添加锁后,会有性能问题

    内部类方式单例

    不需要考虑线程安全,没有性能问题

    可通过反射和反序列化方式暴力破坏单例

    枚举类方式单例(注册式单例)

    既能满足单例要求,又无法被反射和序列化方式破解

    相对目前最优实现单例方式

    容器注入方式单例(注册式单例)

    作为容器,可存放多种对象的单个实例

    需要考虑多线程安全问题,添加锁

    2、思考破坏单例模式的方式有哪些?并且归纳总结

       目前破坏单例模式的方式主要有反射和序列化。

       反射:普通java类可以通过反射获取到构造方法,从而调用构造方法创建新对象。

             但是枚举类方式单例不能通过发射破坏,因为枚举单例反编译后可以看到,枚举类实际内部没有无参构造方法。另外,如果反射想通过调用有参构造方法,去创建实例时,反射机制的调用源码已经做了判断,判断当前调用类是否是枚举,如果是枚举类,则不允许进行反射调用构造方法创建实例对象。

       序列化:序列化方式,当读取文件流生成对象时,如果是object类型,会去检查是否含有构造方法,如果有,会重新newInstance创建新对象。如果是枚举类型,会没有调用new 对象的动作,而是根据枚举名称直接获取枚举值。所以枚举类方式单例不会被反序列化破解,普通单例可以。

    3、梳理内部类的执行逻辑,并画出时序图。

     

  • 相关阅读:
    jenkins配置QQ邮箱自动发送RF测试构建结果通知邮件
    扩展RF,实现失败用例自动再执行
    python-函数-非固定参数
    robot framework 中对于有滚动条的页面中元素的处理
    selenium(python)下定位单个元素的常用方法
    selenium(python)close与quit的区别
    Robot FrameWork UI自动化脚本稳定性与原生关键字
    深copy和浅copy(python)
    尚硅谷MySQL高级_笔记(2018年10月5日22:55:39)
    云知梦css学习笔记(2018年4月1日16:18:17)
  • 原文地址:https://www.cnblogs.com/ningJJ/p/10922837.html
Copyright © 2020-2023  润新知