1. 什么是单例模式?
单例模式是一种 **创建型设计模式**,确保一个类 **只有一个实例**,并提供一个 **全局访问点** 来获取该实例。它的核心目标是控制对象的创建过程,避免资源重复占用或状态不一致。
核心原则:
2. 应用场景
单例模式适用于需要 **全局唯一对象** 的场景,例如:
3. 单例模式的实现方式
3.1 饿汉式(Eager Initialization)
public class Singleton {
private static final Singleton instance = new Singleton();
private Singleton() {} // 私有构造函数
public static Singleton getInstance() {
return instance;
}
}
3.2 懒汉式(Lazy Initialization)
public class Singleton {
private static Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
3.3 线程安全的懒汉式(加锁)
public class Singleton {
private static Singleton instance;
private Singleton() {}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
3.4 双重检查锁(Double-Checked Locking)
public class Singleton {
private static volatile Singleton instance; // volatile 防止指令重排序
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) { // 第一次检查
synchronized (Singleton.class) {
if (instance == null) { // 第二次检查
instance = new Singleton();
}
}
}
return instance;
}
}
3.5 静态内部类(Holder)
public class Singleton {
private Singleton() {}
private static class Holder {
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return Holder.INSTANCE;
}
}
3.6 枚举(Enum)
public enum Singleton {
INSTANCE; // 单例实例
public void doSomething() {
// 业务方法
}
}
4. 单例模式的线程安全问题
- 使用 `synchronized` 或双重检查锁(DCL)。
- 通过静态内部类或枚举实现(推荐)。
5. 防止反射和序列化破坏单例
public class Singleton implements Serializable {
private static final Singleton instance = new Singleton();
private Singleton() {
if (instance != null) {
throw new IllegalStateException("单例已存在!");
}
}
// 防止反序列化创建新对象
protected Object readResolve() {
return instance;
}
}
6. 单例模式的优缺点
- 全局唯一实例,避免资源浪费。
- 提供统一的访问入口。
- 违反单一职责原则(类需管理自身实例)。
- 可能隐藏类之间的依赖关系,增加测试难度。
- 长期持有实例可能导致内存泄漏(如 Android 中 Context 单例)。
7. 实际开发中的注意事项
8. 总结
单例模式的核心是 **控制实例数量** 和 **提供全局访问点**。实现时需根据场景选择合适的方式:
- 简单场景:枚举或静态内部类。
- 复杂线程安全需求:双重检查锁。
- 框架开发:结合依赖注入容器(如 Spring)。
正确使用单例模式能优化资源管理,但需警惕其潜在的缺点和误用风险。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。