单例的五种实现方式,及其性能分析(转)
来源:互联网 发布:python append和extend 编辑:程序博客网 时间:2024/06/05 06:56
序言
在23种设计模式中,单例是最简单的设计模式,但是也是很常用的设计模式。从单例的五种实现方式中我们可以看到程序员对性能的不懈追求。下面我将分析单例的五种实现方式的优缺点,并对其在多线程环境下的性能进行测试。
实现
单例模式适用于资源占用较多的类,保证一个类只有一个实例即单例。通用的做法就是构造器私有化,提供一个全局的访问点,返回类的实例。
uml图:
1.饿汉式
代码实现:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
优点
1.实例的初始化由JVM装载类的时候进行,保证了线程的安全性2.实现简单方便3.实例的访问效率高
缺点
1.不能实现懒加载,如果不调用getInstance(),那么这个类就白白的占据内存,资源的利用率不高
注意
1.防止通过反射调用构造方法破解单例模式。2.防止通过反序列产生新的对象。
2.懒汉式
代码实现:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
优点
1.只有使用这个类的时候才初始化实例,优化了资源利用率
缺点
1.为了实现线程安全,使用了同步方法获取,增加了访问的开销
注意
1.防止通过反射调用构造方法破解单例模式。2.防止通过反序列产生新的对象。
3.双重检查
代码实现:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
优点
1.实现懒加载2.通过缩小同步区域和第一次检查提高访问效率
缺点
1.为了实现线程安全,使用了同步方法获取,增加了访问的开销
注意
1.防止通过反射调用构造方法破解单例模式。2.防止通过反序列产生新的对象。
4.静态内部类
代码实现:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
优点
1.即实现了线程安全,又实现了懒加载
缺点
2.实现稍显复杂
5.枚举实现
代码实现:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
优点
1.实现简单2.线程安全3.天热对反射和反序列化漏洞免疫(由JVM提供)
缺点
2.不能实现懒加载
注意
1.防止通过反射调用构造方法破解单例模式。2.防止通过反序列产生新的对象。
测试
源码
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
为了统计所以线程执行完需要的时间,我写了一个工具类
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
结果
五种单例实现方式,在100个线程下,每个线程访问1千万次实例的用时.
(*注意:由于不同电脑之间的性能差异,测试的结果可能不同)
总结
如果需要懒加载就使用静态内部类方式,如果不需要就使用枚举方式。
阅读全文
0 0
- 单例的五种实现方式,及其性能分析。
- 单例的五种实现方式,及其性能分析。
- 单例的五种实现方式,及其性能分析
- 单例的五种实现方式,及其性能分析(转)
- 单例模式的五种实现方式
- 单例模式的五种实现方式
- 单例模式的五种实现方式
- 单例模式五种实现方式
- 五种创建单例的方式
- Java多线程(五)之BlockingQueue深入分析及其实现类实现方式分析
- 单例模式的7种实现方式及分析
- 单例模式 及其实现方式
- java单例模式五种实现方式
- ANDROID设计模式之单例模式的五种实现方式
- JAVA设计模式-单例模式(Singleton)的五种实现方式
- HashMap循环遍历方式及其性能对比 主要介绍HashMap的四种循环遍历方式,各种方式的性能测试对比,根据HashMap的源码实现分析性能结果,总结结论。
- 单例模式详细分析&7种实现方式
- 单例的三种实现方式
- DSL Domain-specific language 领域特定语言/领域专用语言
- MySQL的IF函数
- python学习日志--day1
- 比较两个MYSQL数据结构的不同
- javascript constructor属性
- 单例的五种实现方式,及其性能分析(转)
- swift
- 统一PaaS架构支撑IT应用开发敏捷化
- POJ 2798 Hardwood Cutting 笔记
- node
- 打包SpringBoot工程并部署
- ELF文件-符号表
- [转]OrCAD Capture Error initializing COM property pages: 无效指针 For WIN7
- python中的random模块