单例模式的3种实现方式, 及其性能对比
2019独角兽企业重金招聘Python工程师标准>>>
1. 懒汉模式(double check), 线程安全, 效率不高, 可以延迟加载
public class Singleton1 implements Serializable {// 用volatile修饰instance, 禁止指令重排序, 为保证多线程安全private volatile static Singleton1 instance = null;private Singleton1() {// 防止反射调用私有构造方法(跳过安全检查), 重复实例化实例if (instance != null) {throw new RuntimeException("error:instance=" + instance);}}public static Singleton1 getInstance() {if (instance == null) {synchronized (Singleton1.class) {if (instance == null) {instance = new Singleton1();}}}return instance;}private Object readResolve() {return instance; // 防止反序列化重复实例化实例}
}
2. 饿汉模式, 线程安全, 效率高, 但是不能延迟加载
public class Singleton2 implements Serializable {private static Singleton2 instance = new Singleton2();private Singleton2() {// 防止反射调用私有构造方法(跳过安全检查),重复实例化实例if (instance != null) {throw new RuntimeException("error:instance isn't null " + instance);}}public static Singleton2 getInstance() {return instance;}private Object readResolve() {return instance; // 防止反序列化重复实例化实例}
}
3. 私有静态内部类, 线程安全, 调用效率高, 可以延迟加载
public class Singleton3 {private Singleton3() {}private static class Singleton0 {private static final Singleton3 instance = new Singleton3();}/** 获取私有静态内部类中的实例对象*/public static Singleton3 getInstance() {return Singleton0.instance;}
}
3种方式的性能分析:
public static void main(String[] args) throws Exception {long start = System.currentTimeMillis();int countNum = 1000;final CountDownLatch count = new CountDownLatch(countNum);for (int i = 0; i < countNum; i++) {new Thread(new Runnable() {@Overridepublic void run() {for (int i = 0; i < 1000000; i++) {// Singleton1.getInstance(); // 懒汉模式(double check)// Singleton2.getInstance(); //饿汉模式Singleton3.getInstance(); // 私有静态内部类}count.countDown();}}).start();}count.await();long end = System.currentTimeMillis();System.out.println(end - start);}
Console输出:
懒汉模式(double check): 310ms
饿汉模式: 150ms
私有静态内部类: 160ms
转载于:https://my.oschina.net/u/2503731/blog/659209
单例模式的3种实现方式, 及其性能对比相关推荐
- 求斐波那契数列第n位的几种实现方式及性能对比
在每一种编程语言里,斐波那契数列的计算方式都是一个经典的话题.它可能有很多种计算方式,例如:递归.迭代.数学公式.哪种算法最容易理解,哪种算法是性能最好的呢? 这里给大家分享一下我对它的研究和总结:下 ...
- 求斐波那契数列第n位的几种实现方式及性能对比(c#语言)
在每一种编程语言里,斐波那契数列的计算方式都是一个经典的话题.它可能有很多种计算方式,例如:递归.迭代.数学公式.哪种算法最容易理解,哪种算法是性能最好的呢? 这里给大家分享一下我对它的研究和总结:下 ...
- 单例模式的几种实现方式及优缺点
参考:单例模式的几种实现方式及优缺点. 转载于:https://www.cnblogs.com/wenxiangchen/p/11343331.html
- python实现单例模式的几种方式_基于Python中单例模式的几种实现方式及优化详解...
单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场. ...
- Java单例模式的几种实现方式
Java单例模式的几种实现方式 在Java 中,单例类只能有一个实例,必须创建自己的唯一实例,单例类必须给所有其他对象提供这一实例.Java 单例模式有很多种实现方式,在这里给大家介绍单例模式其中的几 ...
- HashMap 的 7 种遍历方式与性能分析!「修正篇」
这是我的第 57 篇原创文章 首先,给大家说声抱歉~ 事情经过是这样子的,五一节前我发布了一篇文章<HashMap 的 7 种遍历方式与性能分析!>,但是好心的网友却发现了一个问题,他说 ...
- python创建单例模式_Python单例模式的四种创建方式实例解析
单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场. ...
- 单例模式的四种实现方式(饿汉模式、懒汉模式、静态内部类、枚举类)
首先,设计模式是我们程序员在软件开发过程中面临的一般问题的解决方案,通过学习设计模式可以使我们在编程时更加有条理性,同时培养我们写代码的思维能力,从而提高我们的工作效率.接下来就跟着博主的脚步往下走吧 ...
- 单例模式的几种实现方式详解以及原理
单例模式介绍 前言 这是一个的萌新写的博客,以下是学习课程以后的总结,用于个人的复习与总结,如果有误还请多多包容和指正. 了解单例模式: 单例类只能有一个实例 单例必须创建自己的唯一一个实例 单例类必 ...
最新文章
- 【Android 内存优化】Bitmap 内存缓存 ( Bitmap 缓存策略 | LruCache 内存缓存 | LruCache 常用操作 | 工具类代码 )
- Keras处理TIFF图像
- NSNull的用法和原理
- LINUX安装DeepStream
- mysql悲观锁替代方案_MySQL中的悲观锁和乐观锁
- 如何监测系统用户是否登录_网站建设教程:PageAdmin Cms如何获取用户登录状态...
- masm5安装教程_MASM使用方法及版本号
- 有什么优质的计算机专业书籍?操作系统、计算机网络、计算机组成、数据结构、数据库.....
- Unity-Photon Pun2个人总结
- java高校选课系统博客,学生选课系统
- ecshop 添加php标签,ECSHOP模板标签【ecshop标签大全】ecshop标签手册
- osgearth看不见靠近摄像机的物体怎么办
- 用C#打开Windows自带的图片传真查看器
- 三国志14计算机中丢失,三国志14无法正常游戏的常见问题和解决办法
- 两位一体数码管引脚图_两位一体数码管 两位一体数码管全新现货
- 测试游戏的软件电脑运行,什么是软件性能测试_电脑测试性能软件_测试电脑游戏性能软件...
- 如何通过编程解决华容道问题?
- ONAP — 编排的核心:模型驱动
- pageoffice 骑缝章_PageOffice在Word文档中加盖电子印章
- 苹果Mac系统如何安装pip命令?
热门文章
- oracle 截取字符串和查找字符
- 关于持续集成几点知识点
- (转载)(c#)数据结构与算法分析 --数组、向量和表
- 春运背后默默守护高铁安全的“隐形人”
- java编写词法分析器
- apache配置反向代理以及实现url重写,防盗链
- linux内核参数注释与优化
- 自由是有代价的:聊聊这几年尝试的道路
- CCleaner v5.55.7108 发布,新增软件升级功能
- C#开发中碰到的问题------Uncaught TypeError: Cannot read property 'style' of undefined