单例模式深度解析:从基础到实现原理
一、单例模式核心概念
单例模式是一种创建型设计模式,确保一个类只有一个实例,并提供该实例的全局访问点。这种模式的核心价值在于:
- ✅ 避免资源冲突(如配置文件、数据库连接池)
- ✅ 节省系统资源开销
- ✅ 统一管理共享资源
- ✅ 控制全局访问点
典型应用场景:
- 配置管理器(全局共享配置)
- 数据库连接池(避免重复创建连接)
- 日志记录器(统一管理日志写入)
- 设备驱动程序(如打印机控制)
- 缓存系统(全局共享缓存数据)
二、单例模式实现方式大全
1. 饿汉式(线程安全)
- public class EagerSingleton {
- private static final EagerSingleton INSTANCE = new EagerSingleton();
-
- private EagerSingleton() {
- // 防止反射攻击
- if (INSTANCE != null) {
- throw new IllegalStateException("Singleton already initialized");
- }
- }
-
- 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. 双重检查锁(DCL)
- public class DoubleCheckedLockingSingleton {
- private static volatile DoubleCheckedLockingSingleton instance;
-
- private DoubleCheckedLockingSingleton() {}
-
- public static DoubleCheckedLockingSingleton getInstance() {
- if (instance == null) {
- synchronized (DoubleCheckedLockingSingleton.class) {
- if (instance == null) {
- instance = new DoubleCheckedLockingSingleton();
- }
- }
- }
- return instance;
- }
- }
复制代码
- ⚡ 优点:线程安全且高性能
- ⚠️ 注意:必须使用volatile防止指令重排序
5. 静态内部类(推荐)
- public class StaticInnerClassSingleton {
- private StaticInnerClassSingleton() {}
-
- private static class Holder {
- static final StaticInnerClassSingleton INSTANCE = new StaticInnerClassSingleton();
- }
-
- public static StaticInnerClassSingleton getInstance() {
- return Holder.INSTANCE;
- }
-
- // 防止反序列化破坏单例
- protected Object readResolve() {
- return getInstance();
- }
- }
复制代码 6. 枚举单例(最佳实践)
- public enum EnumSingleton {
- INSTANCE;
-
- // 添加业务方法
- public void businessMethod() {
- System.out.println("Business logic executed");
- }
- }
复制代码 三、静态内部类原理深度剖析
静态内部类实现之所以无需同步开销,关键在于利用了Java类加载机制的天然线程安全性:
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |