精心整理了最新的面试资料和简历模板,有需要的可以自行获取
一、什么是单例模式?
单例模式(Singleton Pattern)是一种创建型设计模式,它保证一个类仅有一个实例 ,并提供一个全局访问点。该模式常用于需要控制资源访问的场景,如数据库连接池、日志记录器、配置管理对象等。
二、核心特性
- 私有化构造函数(防止外部实例化)
- 静态私有成员变量(保存唯一实例)
- 静态公有访问方法(全局访问入口)
三、6种经典实现方式
1. 饿汉式(线程安全)
java
public class EagerSingleton {
private static final EagerSingleton instance = new EagerSingleton();
private EagerSingleton() {}
public static EagerSingleton getInstance() {
return instance;
}
}
- ✅ 优点:实现简单,线程安全
- ❌ 缺点:类加载时立即初始化,可能造成资源浪费
2. 懒汉式(非线程安全)
java
public class LazySingleton {
private static LazySingleton instance;
private LazySingleton() {}
public static LazySingleton getInstance() {
if (instance == null) {
instance = new LazySingleton();
}
return instance;
}
}
- ✅ 优点:延迟初始化
- ❌ 缺点:多线程环境下可能创建多个实例
3. 线程安全懒汉式(同步方法)
java
public class SynchronizedSingleton {
private static SynchronizedSingleton instance;
private SynchronizedSingleton() {}
public static synchronized SynchronizedSingleton getInstance() {
if (instance == null) {
instance = new SynchronizedSingleton();
}
return instance;
}
}
- ✅ 优点:保证线程安全
- ❌ 缺点:同步锁影响性能
4. 双重检查锁定(Double-Check Locking)
java
public class DCLSingleton {
private volatile static DCLSingleton instance;
private DCLSingleton() {}
public static DCLSingleton getInstance() {
if (instance == null) {
synchronized (DCLSingleton.class) {
if (instance == null) {
instance = new DCLSingleton();
}
}
}
return instance;
}
}
- ✅ 优点:延迟加载且高效
- 🔑 关键点:
volatile
关键字防止指令重排序
5. 静态内部类实现
java
public class InnerClassSingleton {
private InnerClassSingleton() {}
private static class Holder {
static final InnerClassSingleton INSTANCE = new InnerClassSingleton();
}
public static InnerClassSingleton getInstance() {
return Holder.INSTANCE;
}
}
- ✅ 优点:线程安全且延迟加载
- 🌟 推荐:兼顾性能与安全性的优雅实现
6. 枚举实现(Effective Java推荐)
java
public enum EnumSingleton {
INSTANCE;
public void doSomething() {
// 业务方法
}
}
- ✅ 优势:
- 天生线程安全
- 防止反射攻击
- 自动处理序列化/反序列化
- 🏆 被《Effective Java》列为最佳实现方式
四、应用场景
- 需要频繁创建/销毁的对象
- 重量级资源管理(数据库连接池)
- 全局配置管理类
- 日志记录器
- 设备驱动程序
五、潜在问题与解决方案
问题类型 | 解决方案 |
---|---|
反射攻击 | 枚举实现/构造器二次校验 |
序列化破坏 | 实现readResolve() 方法 |
多类加载器 | 指定类加载器策略 |
多线程竞争 | 双重检查锁定/内部类实现 |
六、总结
单例模式是Java中最常用的设计模式之一,不同实现方式各有优劣:
- 优先选择枚举实现(符合JDK规范)
- 需要延迟加载时推荐静态内部类
- 旧版本JDK可考虑双重检查锁定
正确使用单例模式可以优化系统资源使用,但需注意避免过度使用导致代码耦合度增加。在实际开发中,建议结合具体需求和安全要求选择最合适的实现方式。