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