找回密码
 立即注册
首页 业界区 业界 【设计模式】单例模式

【设计模式】单例模式

嘀荼酴 2025-6-26 13:54:29
单例模式深度解析:从基础到实现原理

一、单例模式核心概念

单例模式是一种创建型设计模式,确保一个类只有一个实例,并提供该实例的全局访问点。这种模式的核心价值在于:

  • ✅ 避免资源冲突(如配置文件、数据库连接池)
  • ✅ 节省系统资源开销
  • ✅ 统一管理共享资源
  • ✅ 控制全局访问点
典型应用场景

  • 配置管理器(全局共享配置)
  • 数据库连接池(避免重复创建连接)
  • 日志记录器(统一管理日志写入)
  • 设备驱动程序(如打印机控制)
  • 缓存系统(全局共享缓存数据)
二、单例模式实现方式大全

1. 饿汉式(线程安全)
  1. public class EagerSingleton {
  2.     private static final EagerSingleton INSTANCE = new EagerSingleton();
  3.    
  4.     private EagerSingleton() {
  5.         // 防止反射攻击
  6.         if (INSTANCE != null) {
  7.             throw new IllegalStateException("Singleton already initialized");
  8.         }
  9.     }
  10.    
  11.     public static EagerSingleton getInstance() {
  12.         return INSTANCE;
  13.     }
  14. }
复制代码

  • ⚡ 优点:实现简单,线程安全
  • ⚠️ 缺点:类加载时即初始化,可能造成资源浪费
2. 懒汉式(非线程安全)
  1. public class LazySingleton {
  2.     private static LazySingleton instance;
  3.    
  4.     private LazySingleton() {}
  5.    
  6.     public static LazySingleton getInstance() {
  7.         if (instance == null) {
  8.             instance = new LazySingleton();
  9.         }
  10.         return instance;
  11.     }
  12. }
复制代码

  • ⚡ 优点:延迟初始化
  • ⚠️ 缺点:多线程环境下不安全
3. 同步方法懒汉式(线程安全)
  1. public class SynchronizedSingleton {
  2.     private static SynchronizedSingleton instance;
  3.    
  4.     private SynchronizedSingleton() {}
  5.    
  6.     public static synchronized SynchronizedSingleton getInstance() {
  7.         if (instance == null) {
  8.             instance = new SynchronizedSingleton();
  9.         }
  10.         return instance;
  11.     }
  12. }
复制代码

  • ⚡ 优点:线程安全
  • ⚠️ 缺点:每次获取实例都加锁,性能差
4. 双重检查锁(DCL)
  1. public class DoubleCheckedLockingSingleton {
  2.     private static volatile DoubleCheckedLockingSingleton instance;
  3.    
  4.     private DoubleCheckedLockingSingleton() {}
  5.    
  6.     public static DoubleCheckedLockingSingleton getInstance() {
  7.         if (instance == null) {
  8.             synchronized (DoubleCheckedLockingSingleton.class) {
  9.                 if (instance == null) {
  10.                     instance = new DoubleCheckedLockingSingleton();
  11.                 }
  12.             }
  13.         }
  14.         return instance;
  15.     }
  16. }
复制代码

  • ⚡ 优点:线程安全且高性能
  • ⚠️ 注意:必须使用volatile防止指令重排序
5. 静态内部类(推荐)
  1. public class StaticInnerClassSingleton {
  2.     private StaticInnerClassSingleton() {}
  3.    
  4.     private static class Holder {
  5.         static final StaticInnerClassSingleton INSTANCE = new StaticInnerClassSingleton();
  6.     }
  7.    
  8.     public static StaticInnerClassSingleton getInstance() {
  9.         return Holder.INSTANCE;
  10.     }
  11.    
  12.     // 防止反序列化破坏单例
  13.     protected Object readResolve() {
  14.         return getInstance();
  15.     }
  16. }
复制代码
6. 枚举单例(最佳实践)
  1. public enum EnumSingleton {
  2.     INSTANCE;
  3.    
  4.     // 添加业务方法
  5.     public void businessMethod() {
  6.         System.out.println("Business logic executed");
  7.     }
  8. }
复制代码
三、静态内部类原理深度剖析

静态内部类实现之所以无需同步开销,关键在于利用了Java类加载机制的天然线程安全性:

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册