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