一起讨论java中的单例模式。单例模式是java设计模式中算是最简单的设计模式了。
* java实现单例模式的写法有很多。你在开发过程中采用的哪一种呢?下面我将写出5种单例模式案例处理。
*
* 第一种:延时加载形式(特点:线程安全,调用效率高。延时加载的)
* 第二种:及时加载形式(特点:线程安全,调用效率不高。及时加载)
* 第三种:双重检测锁形式(特点:及时加载提高调用效率高。由于JVM底层内部结构问题。时不时会出现异常错误.(不建议使用.只是提供学习思路)
* 第四种:静态内部类形式(特点:线程安全,调用效率高,延时加载的 优点:兼容高并发调用)
* 第五种:枚举形式(特点:线程安全,调用效率高,及时加载。最优点:枚举本身就是单例模式,同时JVM底层保障,避免了反射和反序列化的漏洞)
*
代码截图
测试案例代码截图
多线程条件下测试(注意:我这里测试的结果是根据本机的运行环境和条件。不作为标准运行时间。):
测试条件: 开启20个线程循环100000次的 耗时如下
测试结果如下:
// (普通的延时(懒)加载-单例)SingletonMode1运行时常:82
// (普通的及时加载-单例)SingletonMode2运行时常:21
// (双重检测锁形式-单例)SingletonMode3运行时常:56
// (静态内部类形式-单例)SingletonMode4运行时常:60
// (枚举形式-单例)SingletonMode5运行时常:22
总结:
A:单例对象,占用资源少,需要及时加载。枚举形式好于普通的及时加载
B: 单例对象,占用资源大,需要延时加载。静态类部类好于普通的延时加载
注意:第一种到第四中都存在反射和反序列化的漏洞。那面在单例的时候也是可以避免的。
* 但是大多同志都是开发普通的项目不是SDK相关东西的,那么对于反射和反序列化的漏洞可以不要去考虑(个人认为)。
*
* 如果有同志想知道避免反射和反序列化的漏洞 请留言!
本文探讨了Java中的五种单例模式实现:延迟加载、及时加载、双重检查锁、静态内部类和枚举形式。每种方式在线程安全和调用效率上各有优劣。在多线程环境下进行测试,枚举形式和静态内部类在性能上表现优秀。总结指出,资源占用少时推荐使用枚举形式,资源占用大时选择静态内部类。同时,文章提到了反射和反序列化漏洞,但在普通项目中通常不必过多考虑。
109

被折叠的 条评论
为什么被折叠?



