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

单例模式简要介绍

学习目标:

  • 单例模式

学习内容:

单例模式(Singleton Pattern)是一种设计模式,其主要目的是确保一个类只有一个实例,并且提供一个全局的访问点。它常用于需要全局唯一对象的场景,例如日志记录器、配置管理器、数据库连接等。

单例模式的核心思想

  • 私有化构造函数:将类的构造函数定义为私有,防止外部直接创建实例。
  • 提供一个静态方法或属性来获取实例:通过一个公共的静态方法或属性来访问唯一的实例。
  • 确保实例的唯一性:类内部创建并保存唯一的实例,确保外部无法创建新的实例。

单例模式的实现

以Java为例,单例模式的经典实现如下:

public class Singleton {// 持有唯一实例的私有静态变量private static Singleton instance;// 私有化构造函数,防止外部实例化private Singleton() {}// 提供公共的静态方法获取实例public static synchronized Singleton getInstance() {if (instance == null) {instance = new Singleton();}return instance;}
}

在这个实现中:

  • instance 是类的唯一实例。
  • getInstance 方法在第一次调用时创建实例,并在后续调用时返回同一实例。
  • 使用 synchronized 关键字确保线程安全,防止多线程环境下创建多个实例。

线程安全的改进

上述实现是线程安全的,但每次获取实例时都需要同步,可能影响性能。可以使用双重检查锁定(Double-Checked Locking)优化:

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

在这个改进中:

  • volatile 关键字确保实例变量的可见性和有序性。
  • 双重检查锁定减少了同步开销,只有在实例为空时才进行同步。

饿汉式单例

另一种实现方式是饿汉式(Eager Initialization),即在类加载时就创建实例:

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

这种方式简单且线程安全,但如果实例的创建依赖于其他参数或配置,可能不适用。

枚举单例

在Java中,还可以使用枚举来实现单例模式,这种方式天生是线程安全的:

public enum Singleton {INSTANCE;// 可以添加其他方法和字段public void someMethod() {// 方法实现}
}

总结

单例模式是创建型设计模式的一种,确保一个类只有一个实例,并提供全局访问点。根据具体需求和环境,可以选择不同的实现方式,如懒汉式、饿汉式或使用枚举。注意在多线程环境下的线程安全问题,选择合适的实现方式来平衡性能和安全性。


http://www.lryc.cn/news/351312.html

相关文章:

  • 深度学习面试问题总结(21)| 模型优化
  • 4月手机行业线上市场销售数据分析
  • 首都师范大学聘请旅美经济学家向凌云为客座教授
  • 多电脑共享鼠标键盘
  • 展厅设计对企业有哪些作用
  • LeetCode-102. 二叉树的层序遍历【树 广度优先搜索 二叉树】
  • 基于时频模糊算子的数据增强方法
  • 浅谈后端整合Springboot框架后操作基础配置
  • 英码科技算能系列边缘计算盒子再添新成员!搭载TPU处理器BM1688CV186AH,功耗更低、接口更丰富
  • selenium 爬取今日头条
  • docker 安装 yapi
  • 【AI如何帮你编写测试用例并输出表格格式】
  • 九宫格转圈圈抽奖活动,有加速,减速效果
  • 利用阿里OSS服务给文件设置过期删除--简单版
  • LabVIEW控制Trio控制器
  • 02--大数据Hadoop集群实战
  • 【ARMv8/v9 异常模型入门及渐进 10 -- WFI 与 WFE 使用详细介绍 1】
  • @DateTimeFormat 和 @JsonFormat 的区别和使用方式
  • C++—结构体
  • 指针与引用
  • 使用 mysql-binlog-connector 监听处理 MySQLBinlog 文件
  • CF Div2 729 Plus and Multiply
  • Joomla 3.7.0 (CVE-2017-8917) SQL注入漏洞环境
  • Python高克勒-曼宁-斯特里克勒公式计算一维流量
  • 【GD32系列--基本定时器Timer + 定时1ms 灯光间隔1s闪烁例程】
  • 第11章 集合与迭代器
  • 探索Linux中的神奇工具:探秘tail命令的妙用
  • 1688商品API接口:电商数据自动化的新引擎
  • 路由器不能端口映射什么原因?如何设置内网映射?
  • 开源RAG,本地mac启动 dify源码服务