懒汉式单例在多线程下需同步控制,推荐双重检查锁(dcl)配合volatile,或静态内部类方式;构造器须私有、静态引用须static,避免异常与耗时操作。

懒汉式单例在多线程环境下必须加同步控制,否则可能创建多个实例。最常用且推荐的方式是双重检查锁(DCL),配合 volatile 关键字防止指令重排序。
双重检查锁(DCL)——兼顾安全与性能
这是目前最主流、平衡性最好的实现方式。它只在第一次创建实例时加锁,后续调用完全无锁,避免了全局同步带来的性能损耗。
- 用 volatile 修饰静态实例变量:禁止 JVM 对 new 实例的初始化过程进行指令重排序,避免其他线程看到“半初始化”的对象
- 外层判空(非同步):快速返回已存在的实例,绝大多数调用不进同步块
- 内层判空(同步块内):确保只有一个线程能执行实例化逻辑,防止锁释放后多个线程重复创建
静态内部类方式——简洁且天然线程安全
利用 Java 类加载机制的特性:内部类只有在首次被主动使用时才加载并初始化静态成员,JVM 保证类初始化过程的线程安全性,无需显式加锁。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 外部类加载时不会触发内部类加载,实现了延迟初始化
- getInstance() 方法直接返回内部类持有的实例,无同步开销
- 代码简洁,可读性强,适合大多数业务场景
同步方法或同步块——简单但不推荐高频使用
虽然能保证线程安全,但粒度太粗,性能瓶颈明显:
- synchronized 方法:每次调用 getInstance() 都要获取类锁,高并发下竞争严重
- synchronized 块 + 双重判空:比同步方法稍好,但仍不如 DCL 或静态内部类高效
注意事项
无论采用哪种方式,都必须满足单例核心要求:
- 构造方法严格私有化(private),杜绝外部 new
- 静态引用必须为 static,确保全局唯一
- 不要在 getInstance() 中抛出异常或做耗时操作,否则影响并发稳定性
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










