当前位置: 首页 > news >正文

单例模式详解:从基础到高级的八种实现方式

单例模式简介

单例模式是一种常用的软件设计模式,其核心定义是:一个类只能允许存在一个实例,并提供一个全局访问点来获取该实例。

应用场景

  • 服务器配置信息管理
  • 数据库连接池
  • 日志管理器
  • 应用计数器
  • 线程池

单例模式的基本实现思路

  1. 私有化构造方法:防止外部通过new关键字创建实例
  2. 提供静态访问方法:通过静态方法返回类的唯一实例

单例模式的八种实现方式

1. 饿汉式(静态常量)✅

public class Singleton {private final static Singleton INSTANCE = new Singleton();private Singleton() {}public static Singleton getInstance() {return INSTANCE;}
}

优点:线程安全,实现简单
缺点:类加载时就初始化,可能造成内存浪费

2. 饿汉式(静态代码块)✅

public class Singleton {private static Singleton instance;static {instance = new Singleton();}private Singleton() {}public static Singleton getInstance() {return instance;}
}

与静态常量方式类似,只是实例化过程放在静态代码块中。

3. 懒汉式(线程不安全)❌

public class Singleton {private static Singleton singleton;private Singleton() {}public static Singleton getInstance() {if (singleton == null) {singleton = new Singleton();}return singleton;}
}

问题:多线程环境下可能创建多个实例

4. 懒汉式(同步方法)⚠️

public class Singleton {private static Singleton singleton;private Singleton() {}public static synchronized Singleton getInstance() {if (singleton == null) {singleton = new Singleton();}return singleton;}
}

优点:线程安全
缺点:同步粒度太大,性能较差

5. 懒汉式(同步代码块)❌

public class Singleton {private static Singleton singleton;private Singleton() {}public static Singleton getInstance() {if (singleton == null) {synchronized (Singleton.class) {singleton = new Singleton();}}return singleton;}
}

问题:仍然存在线程安全问题,无法完全保证单例

6. 双重检查锁定 ✅

public class Singleton {private static volatile Singleton singleton;private Singleton() {}public static Singleton getInstance() {if (singleton == null) {synchronized (Singleton.class) {if (singleton == null) {singleton = new Singleton();}}}return singleton;}
}

关键点

  • volatile关键字防止指令重排序
  • 两次null检查确保线程安全
  • 同步块内再次检查避免多实例

优点:线程安全、延迟加载、效率高

7. 静态内部类 ✅

public class Singleton {private Singleton() {}private static class SingletonInstance {private static final Singleton INSTANCE = new Singleton();}public static Singleton getInstance() {return SingletonInstance.INSTANCE;}
}

原理:利用类加载机制保证线程安全,静态内部类在首次调用getInstance()时才会加载

优点:线程安全、实现简单、延迟加载

8. 枚举 ✅

public enum Singleton {INSTANCE;public void whateverMethod() {// 业务方法}
}

优势

  • 绝对防止多实例创建
  • 天然防止反射攻击
  • 自动支持序列化机制
  • 代码简洁

单例模式的进阶考虑

反射攻击防护

public class Singleton {private static volatile Singleton instance;private Singleton() {// 防止反射攻击if (instance != null) {throw new RuntimeException("单例模式禁止通过反射创建实例");}}public static Singleton getInstance() {if (instance == null) {synchronized (Singleton.class) {if (instance == null) {instance = new Singleton();}}}return instance;}
}

序列化安全

public class Singleton implements Serializable {private static final long serialVersionUID = 1L;private static class SingletonHolder {private static final Singleton INSTANCE = new Singleton();}private Singleton() {}public static Singleton getInstance() {return SingletonHolder.INSTANCE;}// 防止反序列化创建新实例protected Object readResolve() {return getInstance();}
}

总结对比

实现方式线程安全延迟加载性能防止反射防止序列化
饿汉式
懒汉式(不安全)
同步方法
双重检查
静态内部类
枚举

最佳实践建议

  1. 追求简单:使用静态内部类方式
  2. 需要防反射:使用枚举方式
  3. 明确不需要延迟加载:使用饿汉式
  4. JDK 1.5+环境:优先考虑双重检查+volatile
  5. 考虑序列化:实现readResolve()方法

单例模式虽然常用,但在分布式系统、微服务架构中需要谨慎使用,避免成为系统瓶颈。

http://www.dtcms.com/a/535828.html

相关文章:

  • 改版网站收费wordpress国人主题
  • web3.0是什么
  • 计网:网络层
  • git学习3
  • HarmonyOS图形图像处理与OpenGL ES实战
  • SunX:以合规正品,重塑Web3交易信任
  • nacos 使用oceanbase(oracle模式)作为数据源
  • 网站排名优化策划网站一个人可以做吗
  • 基于springboot的民宿在线预定平台开发与设计
  • 脚本探索--Spatial HD进行CNV分析
  • 介绍一下Hystrix的“舱壁模式”和“熔断状态机”
  • 基数排序(Radix Sort)算法简介
  • 【C++项目】基于设计模式的同步异步日志系统(前置基础知识)
  • JDK8时间相关类,时间对象都是不可变的
  • Java内存模型(JMM)与JVM内存模型
  • h5响应式网站模板如何做公司自己的网站首页
  • CentOS7 使用 centos-release-scl-rh yum库安装 devtoolset
  • UI自动化测试:Jenkins配置
  • 软件开发公司网站模板网站开发工程师绩效
  • c++中list详解
  • 杨凌美畅用 TDengine 时序数据库,支撑 500 条产线 2 年历史数据追溯
  • 4.Rocky Linux 网络配置
  • <数据集>yolo螺丝螺母识别数据集<目标检测>
  • Visual Studio 2022 安装使用:Entity Framework Core
  • Oracle 19c 备份技术教学文档
  • 企业做网站电话约见客户的对话wordpress 创意
  • 网站引导制作做网站公司 包含了服务器费用吗
  • 【SpringCloud】Hystrix、Resilience4j 简述
  • npm 发布node后台安装包和依赖库的方法
  • HarmonyOS语音交互与媒体会话开发实战