精心整理了最新的面试资料和简历模板,有需要的可以自行获取
点击前往百度网盘获取
点击前往夸克网盘获取
一、什么是单例模式?
单例模式(Singleton Pattern)是一种创建型设计模式,确保一个类只有一个实例,并提供全局访问点。其核心价值在于:
- 避免重复创建对象,节省系统资源
- 保证全局状态一致性
- 控制共享资源的访问
二、经典实现方式
1. 饿汉式(Eager Initialization)
public class EagerSingleton {// 类加载时立即初始化private static final EagerSingleton instance = new EagerSingleton();// 私有构造方法private EagerSingleton() {}public static EagerSingleton getInstance() {return instance;}
}
特点:
- 线程安全
- 可能造成资源浪费(未使用即加载)
2. 懒汉式(Lazy Initialization)
public class LazySingleton {private static LazySingleton instance;private LazySingleton() {}public static synchronized LazySingleton getInstance() {if (instance == null) {instance = new LazySingleton();}return instance;}
}
特点:
- 延迟加载
- 同步锁影响性能
3. 双重校验锁(Double-Checked Locking)
public class DCLSingleton {private static volatile DCLSingleton instance;private DCLSingleton() {}public static DCLSingleton getInstance() {if (instance == null) {synchronized (DCLSingleton.class) {if (instance == null) {instance = new DCLSingleton();}}}return instance;}
}
关键点:
volatile
防止指令重排序- 减少同步代码块范围
4. 静态内部类(Holder Pattern)
public class HolderSingleton {private HolderSingleton() {}private static class Holder {private static final HolderSingleton INSTANCE = new HolderSingleton();}public static HolderSingleton getInstance() {return Holder.INSTANCE;}
}
优势:
- 天然线程安全
- 延迟加载
- 无同步性能损耗
5. 枚举实现(Effective Java推荐)
public enum EnumSingleton {INSTANCE;public void doSomething() {// 业务方法}
}
优点:
- 绝对防止反射攻击
- 自动处理序列化
- 代码最简洁
三、单例模式的应用场景
- 配置管理器
- 数据库连接池
- 日志记录器
- 线程池管理
- 缓存系统
四、潜在问题与解决方案
问题类型 | 解决方案 |
---|---|
反射攻击 | 私有构造器添加实例存在检查 |
序列化破坏 | 实现readResolve()方法 |
多类加载器 | 指定类加载器 |
多线程环境 | 选择合适的线程安全实现方案 |
五、最佳实践建议
- 优先选择枚举或静态内部类实现
- 谨慎使用synchronized关键字
- 考虑依赖注入框架(如Spring)管理单例
- 避免在分布式系统中滥用单例
- 单元测试时注意单例状态重置
六、单例模式 vs 静态类
特性 | 单例模式 | 静态类 |
---|---|---|
接口实现 | 支持 | 不支持 |
延迟加载 | 可实现 | 不可实现 |
继承机制 | 支持 | 不支持 |
内存管理 | 可被GC回收 | 常驻内存 |
总结:单例模式是Java开发中应用最广泛的设计模式之一,但需要根据具体场景选择合适的实现方式。现代开发中,建议优先考虑枚举实现或结合IoC容器管理对象生命周期,在保证功能性的同时提高代码的可维护性。