美文网首页
Java中单例模式你用的哪一种?

Java中单例模式你用的哪一种?

作者: 小猎豹_wubangxin | 来源:发表于2017-03-16 15:51 被阅读0次

    一起讨论java中的单例模式。单例模式是java设计模式中算是最简单的设计模式了。

    * java实现单例模式的写法有很多。你在开发过程中采用的哪一种呢?下面我将写出5种单例模式案例处理。

    *

    * 第一种:延时加载形式(特点:线程安全,调用效率高。延时加载的)

    * 第二种:及时加载形式(特点:线程安全,调用效率不高。及时加载)

    * 第三种:双重检测锁形式(特点:及时加载提高调用效率高。由于JVM底层内部结构问题。时不时会出现异常错误.(不建议使用.只是提供学习思路)

    * 第四种:静态内部类形式(特点:线程安全,调用效率高,延时加载的 优点:兼容高并发调用)

    * 第五种:枚举形式(特点:线程安全,调用效率高,及时加载。最优点:枚举本身就是单例模式,同时JVM底层保障,避免了反射和反序列化的漏洞)

    *

    代码截图

    测试案例代码截图

    多线程条件下测试(注意:我这里测试的结果是根据本机的运行环境和条件。不作为标准运行时间。):

    测试条件: 开启20个线程循环100000次的 耗时如下

    测试结果如下:

    // (普通的延时(懒)加载-单例)SingletonMode1运行时常:82

    // (普通的及时加载-单例)SingletonMode2运行时常:21

    // (双重检测锁形式-单例)SingletonMode3运行时常:56

    // (静态内部类形式-单例)SingletonMode4运行时常:60

    // (枚举形式-单例)SingletonMode5运行时常:22

    总结:

    A:单例对象,占用资源少,需要及时加载。枚举形式好于普通的及时加载

    B: 单例对象,占用资源大,需要延时加载。静态类部类好于普通的延时加载

    注意:第一种到第四中都存在反射和反序列化的漏洞。那面在单例的时候也是可以避免的。

    * 但是大多同志都是开发普通的项目不是SDK相关东西的,那么对于反射和反序列化的漏洞可以不要去考虑(个人认为)。

    *

    * 如果有同志想知道避免反射和反序列化的漏洞 请留言!

    相关文章

      网友评论

          本文标题:Java中单例模式你用的哪一种?

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