静态内部类是java单例懒加载的推荐方式,利用jvm类加载机制:外部类加载时不初始化内部类,仅首次调用getinstance()触发singletonholder类初始化,由jvm自动加锁确保线程安全与懒加载,无需synchronized或volatile。

Java中单例模式通过static静态变量初始化,本质是利用类加载机制控制实例创建时机。关键不在于“能不能用static变量”,而在于“怎么用”——直接赋值属于饿汉式,延迟创建需配合其他机制才能实现懒加载。
饿汉式:static变量直接初始化
这是最直接的用法:在类加载阶段就完成实例创建,天然线程安全,但不具备懒加载特性。
- static final修饰的变量在类准备阶段分配内存并初始化,JVM保证其唯一性和线程安全性
- 适用于构造简单、无依赖资源的场景,比如工具类、配置管理器
- 示例中instance在Singleton类被首次引用(如调用getInstance)前就已存在,哪怕程序从不调用该方法也会创建
静态代码块方式:可控的饿汉式
把实例创建逻辑放进static块,和直接赋值效果一致,但支持更复杂的初始化流程。
- static块随类加载执行一次,JVM自动同步,无需手动加锁
- 适合需要多步操作(如读配置、建连接)后再赋值的场景
- 仍属于“类加载即初始化”,不是懒加载,但比单纯赋值更灵活
静态内部类:真正支持懒加载的static方案
这是推荐做法——外部类含static方法,内部类含static final实例,靠JVM类加载延迟触发。
- Singleton类加载时,Holder内部类不加载;仅首次调用getInstance()才触发Holder类初始化
- 由JVM保证
方法的线程安全,无需synchronized或volatile - 兼顾懒加载、线程安全、无性能损耗,是《Effective Java》明确推荐的方式
懒汉式+volatile:static变量配合双重检查
当必须在getInstance里做运行时判断或参数处理时,用static变量+volatile+synchronized组合。
- volatile防止指令重排序,确保其他线程看到的是完全构造好的对象
- synchronized只在第一次创建时生效,后续调用无锁开销
- 比基础懒汉式安全,比静态内部类略重,适合有初始化逻辑依赖的场景
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











