双重检查锁(DCL)单例的优点
-
懒加载,节省内存
只有第一次调用
getInstance()时才创建对象,类加载时不会提前实例化;如果程序全程不用这个单例,就不会占用堆内存。饿汉式做不到这点。 -
线程安全
通过
synchronized同步锁保证多线程并发环境下只会创建一个实例,不会出现多个对象。 -
并发性能高
外层第一层
if(instance == null)做判断:实例已经创建后,后续所有线程直接跳过同步代码块,不用竞争锁,避免频繁加锁带来的性能损耗。
如果直接给
getInstance()方法加synchronized,每次调用都要抢锁,效率很低。 -
延迟创建 + 线程安全兼顾
普通懒汉式是懒加载但多线程不安全;DCL 同时解决了「延迟初始化」和「并发安全」两个需求。
-
使用简单,无需依赖内部类/枚举
相比静态内部类、枚举单例,DCL 逻辑直观,适合需要理解锁、volatile 底层原理的业务场景。
简短总结(面试背诵版)
- 懒加载,不浪费内存;
- 多线程环境安全;
- 已有实例时无需加锁,并发效率高;
- 同时兼顾延迟初始化与线程安全。