1.什么是单例模式
一个类只有一个实列,并且提供一个对外访问该实例的全局访问点。
常见应用场景:数据库连接池,项目中读取配置文件的类,servlet也是单列,Spring中的Bean默认也是单列
2.单例模式好处
- 由于单例模式仅有一个实例,对系统来说性能开销较小,如:应用程序启动读取配置文件时,可以产生一个单列对象,使其驻留在内存中。
- 单列模式存在对外全局访问点,可以优化环境共享资源的访问。
3.常用单例模式
- 饿汉式
- 懒汉式
- 双重检查锁
- 静态内部类
- 枚举类
一般情况下,大家知道前两个已经基本ok了,如果再拿后三个跟面试管去“砍”,相信他会对你另眼相看。
- 饿汉式(线程安全,访问效率高,不能赖加载)
- 懒汉式(线程安全,访问效率低,可以懒加载)
- 双重检查锁
- 静态内部类(推荐使用)
- 枚举类(基于JVM底层实现,天然线程安全,不能延迟加载)
4.性能对比
测试代码:
五种单列模式耗时如下:
说明:以下只是相对测试结果,机器配置不同可能测试结果有出入。
单列模式名 |
耗时 |
饿汉式 | 14ms |
懒汉式 | 4404ms |
双重检查锁 | 18ms |
静态内部类 | 16ms |
单例 | 15ms |