【24种设计模式】单例模式(Singleton Pattern)
当我们需要确保一个类只有一个实例时,可以使用单例模式。单例模式确保一个类只有一个实例,并提供一个全局访问点来获取该实例。
单例模式有多种实现方式,包括饿汉式、懒汉式和双重检查锁等。下面我们将分别介绍这些实现方式的特点和示例。
饿汉式单例模式
饿汉式单例模式在类加载时就创建了实例,因此它是线程安全的。具体实现如下:
public class Singleton {private static final Singleton instance = new Singleton();private Singleton() {// 私有构造函数}public static Singleton getInstance() {return instance;}
}
在这个示例中,我们将构造函数设为私有,防止其他类直接创建该类的实例。然后,我们在类中定义一个私有静态变量 instance,并在类加载时进行初始化。最后,我们提供一个公共的静态方法 getInstance() 来获取该实例。
懒汉式单例模式
懒汉式单例模式延迟创建实例,只有在第一次使用时才进行初始化。懒汉式单例模式可能存在线程安全问题,因此需要考虑多线程环境下的实现。下面是一种线程安全的懒汉式单例模式实现方式:
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;}
}
在这个示例中,我们将构造函数设为私有,防止其他类直接创建该类的实例。然后,我们定义一个私有静态变量 instance,并使用 volatile 关键字来确保多线程环境下的可见性。在 getInstance() 方法中,我们使用双重检查锁机制来确保只有在实例为 null 时才进行初始化。
双重检查锁单例模式
双重检查锁单例模式是懒汉式单例模式的改进,它通过减少同步的次数来提高性能。具体实现如下:
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;}
}
在这个示例中,我们使用了双重检查锁机制,首先检查实例是否已经被创建,如果没有,则进入同步块。在同步块内部,再次检查实例是否已经被创建,如果没有,则创建实例。这样可以减少同步的次数,提高性能。
无论是饿汉式、懒汉式还是双重检查锁单例模式,它们都可以确保一个类只有一个实例,并提供一个全局访问点来获取该实例。选择适合的单例模式实现方式取决于实际需求和性能考虑。单例模式在许多场景中都有应用,例如日志记录器、数据库连接池等。
当我们需要确保一个类只有一个实例时,可以使用单例模式。单例模式具有以下特点和应用场景:
-
特点:
- 单例模式确保一个类只有一个实例,并提供一个全局访问点来获取该实例。
- 单例类的构造函数必须是私有的,以防止其他类直接创建实例。
- 单例类通过静态方法或枚举实现全局访问点。
-
应用场景:
- 日志记录器:在多个地方记录日志时,使用单例模式可以确保只有一个日志记录器实例,方便统一管理和控制日志输出。
- 配置信息管理器:在应用程序中,通常会有一些全局的配置信息,使用单例模式可以确保只有一个配置信息管理器实例,方便读取和修改配置信息。
- 数据库连接池:在高并发的情况下,使用单例模式可以确保只有一个数据库连接池实例,避免创建过多的数据库连接,提高性能和资源利用率。
- 缓存:在需要缓存数据的场景中,使用单例模式可以确保只有一个缓存实例,方便统一管理和操作缓存数据。
- 线程池:在需要管理线程的场景中,使用单例模式可以确保只有一个线程池实例,方便统一管理和调度线程任务。
除了上述应用场景,单例模式在许多其他情况下也有应用。它可以提供全局的访问点,方便对实例进行控制和操作。同时,单例模式还可以节省系统资源,避免创建过多的实例。
需要注意的是,单例模式可能会造成全局状态的存在,增加了程序的耦合性。因此,在使用单例模式时需要慎重考虑,确保真正需要全局唯一实例的场景才使用。此外,如果单例类的实例需要进行资源释放或销毁,需要额外考虑实现方式,以免造成资源泄露或内存泄露的问题。
相关文章:
【24种设计模式】单例模式(Singleton Pattern)
当我们需要确保一个类只有一个实例时,可以使用单例模式。单例模式确保一个类只有一个实例,并提供一个全局访问点来获取该实例。 单例模式有多种实现方式,包括饿汉式、懒汉式和双重检查锁等。下面我们将分别介绍这些实现方式的特点和示例。 …...
shell算数运算指令、
1.shell算数运算的指令 (( )) $[ ] let expr expr的字符串运算 例子: 2.shell的if分支结构...
数字孪生与智慧城市:开启未来智慧生活
在数字时代的浪潮中,数字孪生技术和智慧城市的理念相互交织,共同塑造了一个更智能、更可持续、更宜居的未来。数字孪生是一项前沿技术,将虚拟世界与现实世界相融合,为城市管理者和市民带来了前所未有的机遇和便捷。 数字孪生模型是…...
jenkins实践篇(1)——基于分支的自动发布
问题背景 想起初来公司时,我们还是在发布机上直接执行发布脚本来运行和部署服务,并且正式环境和测试环境的脚本都在一起,直接手动操作脚本时存在比较大的风险就是将环境部署错误,并且当时脚本部署逻辑还没有检测机制,…...
Microsoft.Extensions 简介
Microsoft.Extensions 简介 一、Microsoft.Extensions 简介 .NET Extensions 是一套官方的、开源的、跨平台的 API 集合,提供了一些常用的编程模式和实用工具,例如依赖项注入、日志记录、缓存、Host以及配置等等。该项目的大多数 API 都被用在 .NET 平…...
k8s 金丝雀发布与声明式管理
Deployment控制器支持自定义控制更新过程中的滚动节奏,如“暂停(pause)”或“继续(resume)”更新操作。比如等待第一批新的Pod资源创建完成后立即暂停更新过程,此时,仅存在一部分新版本的应用,主体部分还是旧的版本。然后…...
百度Comate SaaS版本正式发布,助力开发者加速研发过程
百度Comate是基于文心大模型的智能代码助手,让开发者的编码更快、更好、更简单,为开发者自动生成完整的、且更符合实际研发场景的代码行或整个代码块,帮助每一位开发者轻松完成研发任务。10月17日召开的百度世界大会上,百度CTO王海…...
8类放球问题
放球问题简介 放球问题是一类很有意思的排列组合问题。通俗来说,就是把n个小球放到m个盒子里,问有几种放法。根据小球是否相同,盒子是否相同,是否允许有空盒,又可以把问题细分为8个具体的问题。其中有一些问题是非常简…...
【APP VTable】和市面上的 Table 组件一样,都是接收表格[] 以及数据源[]
博主:_LJaXi Or 東方幻想郷 专栏: uni-app | 小程序开发 开发工具:HBuilderX 这里写目录标题 表格组件USE 表格组件 <template><view class"scroll-table-wrapper"><view class"scroll-table-container"…...
深度学习 anaconda 安装问题
配置anaconda 在官网下载匹配版本的anaconda(官网下载可能时间比较长),可以选择清华镜像。 安装过程默认即可,或者根据情况进行修改。 旧版本是可以在安装的时候勾选添加路径到环境变量中的,但是我安装的是2023.9月…...
为什么现在学Rust编程是最好时机?
1.摘要 Rust是由Mozilla主导开发的通用、编译型编程语言。设计准则为:安全、并发、实用,支持函数式、并发式、过程式以及面向对象的编程风格。Rust的设计目标之一,是要使设计大型的互联网客户端和服务器的任务变得更容易,因此更加强调安全性、存储器配置以及并发处理等方面的特…...
Java——Spring的控制反转(一文详解IOC)
Spring,Spring MVC,Spring Boot 三者比较 答: 这三者专注的领域不同,解决的问题也不一样;总的来说,Spring 就像一个大家族,有众多衍生产品例如 Boot,Security,JPA等等。…...
Android Glide限定onlyRetrieveFromCache取内存缓存submit超时阻塞方式,Kotlin
Android Glide限定onlyRetrieveFromCache取内存缓存submit超时阻塞方式,Kotlin import android.os.Bundle import android.util.Log import android.widget.ImageView import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.lifecycleScope import com.b…...
tinymce输入框怎么限制只输入空格或者回车时不能提交
项目场景: 项目相关背景: tinymce输入框只输入空格或者回车时提交的空数据毫无意义,所以需要限制一下 无意义的输入: 解决方案: 因为tinymce输入框传到后端的数据是代码形式,所以不能直接.trem&#…...
时间、空间复杂度的例题详解
文章前言 上篇文章带大家认识了数据结构和算法的含义,以及理解了时间、空间复杂度,那么接下来来深入理解一下时间、空间复杂度。 时间复杂度实例 实例1 // 计算Func2的时间复杂度? void Func2(int N) {int count 0;for (int k 0; k <…...
Ubuntu22.04 搭建 OpenHarmony 命令行开发环境
文章目录 简介安装工具链获取gitee源码安装编译工具编译测试 简介 在本文中,我们将介绍如何使用命令行工具在你的设备上安装OpenHarmony操作系统。OpenHarmony是一个开源的、面向物联网(IoT)设备的操作系统,它提供了一套全面的开…...
10.27 知识总结(前端)
一、 前端 1.1 什么是前端? 前端是所有跟用户直接打交道的都可以称之为是前端 比如:PC页面、手机页面、平板页面、汽车显示屏、大屏幕展示出来的都是前端内容 通俗点就是能够用肉眼看到的都是“前端” 1.2 为什么要学前端 学了前端以后我们就可以做全栈工…...
操作系统(02326)考试题库
博客主页:https://tomcat.blog.csdn.net 博主昵称:农民工老王 主要领域:Java、Linux、K8S 期待大家的关注💖点赞👍收藏⭐留言💬 目录 单选题多选题主观题 单选题 把并发进程中与共享变量有关的程序段称为…...
LeetCode题:70爬楼梯,126斐波那契数
目录 70:爬楼梯 题目要求: 解题思路:(类似斐波那契数) 递归解法: 非递归解法: 126:斐波那契数 题目要求: 解题思路: 递归解法: 非递归解…...
VTK OrientationMarker 方向 三维坐标系 相机坐标轴 自定义坐标轴
本文 以 Python 语言开发 我们在做三维软件开发时,经常会用到相机坐标轴,来指示当前空间位置; 坐标轴效果: 相机方向坐标轴 Cube 正方体坐标轴 自定义坐标轴: Code: Axes def main():colors vtkNamedC…...
华为云AI开发平台ModelArts
华为云ModelArts:重塑AI开发流程的“智能引擎”与“创新加速器”! 在人工智能浪潮席卷全球的2025年,企业拥抱AI的意愿空前高涨,但技术门槛高、流程复杂、资源投入巨大的现实,却让许多创新构想止步于实验室。数据科学家…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
04-初识css
一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...
QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...
中医有效性探讨
文章目录 西医是如何发展到以生物化学为药理基础的现代医学?传统医学奠基期(远古 - 17 世纪)近代医学转型期(17 世纪 - 19 世纪末)现代医学成熟期(20世纪至今) 中医的源远流长和一脉相承远古至…...
搭建DNS域名解析服务器(正向解析资源文件)
正向解析资源文件 1)准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2)服务端安装软件:bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...
MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)
macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 🍺 最新版brew安装慢到怀疑人生?别怕,教你轻松起飞! 最近Homebrew更新至最新版,每次执行 brew 命令时都会自动从官方地址 https://formulae.…...
32单片机——基本定时器
STM32F103有众多的定时器,其中包括2个基本定时器(TIM6和TIM7)、4个通用定时器(TIM2~TIM5)、2个高级控制定时器(TIM1和TIM8),这些定时器彼此完全独立,不共享任何资源 1、定…...
FTXUI::Dom 模块
DOM 模块定义了分层的 FTXUI::Element 树,可用于构建复杂的终端界面,支持响应终端尺寸变化。 namespace ftxui {...// 定义文档 定义布局盒子 Element document vbox({// 设置文本 设置加粗 设置文本颜色text("The window") | bold | color(…...
Linux入门课的思维导图
耗时两周,终于把慕课网上的Linux的基础入门课实操、总结完了! 第一次以Blog的形式做学习记录,过程很有意思,但也很耗时。 课程时长5h,涉及到很多专有名词,要去逐个查找,以前接触过的概念因为时…...
