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