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

【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;}
}

在这个示例中,我们使用了双重检查锁机制,首先检查实例是否已经被创建,如果没有,则进入同步块。在同步块内部,再次检查实例是否已经被创建,如果没有,则创建实例。这样可以减少同步的次数,提高性能。

无论是饿汉式、懒汉式还是双重检查锁单例模式,它们都可以确保一个类只有一个实例,并提供一个全局访问点来获取该实例。选择适合的单例模式实现方式取决于实际需求和性能考虑。单例模式在许多场景中都有应用,例如日志记录器、数据库连接池等。
当我们需要确保一个类只有一个实例时,可以使用单例模式。单例模式具有以下特点和应用场景:

  1. 特点:

    • 单例模式确保一个类只有一个实例,并提供一个全局访问点来获取该实例。
    • 单例类的构造函数必须是私有的,以防止其他类直接创建实例。
    • 单例类通过静态方法或枚举实现全局访问点。
  2. 应用场景:

    • 日志记录器:在多个地方记录日志时,使用单例模式可以确保只有一个日志记录器实例,方便统一管理和控制日志输出。
    • 配置信息管理器:在应用程序中,通常会有一些全局的配置信息,使用单例模式可以确保只有一个配置信息管理器实例,方便读取和修改配置信息。
    • 数据库连接池:在高并发的情况下,使用单例模式可以确保只有一个数据库连接池实例,避免创建过多的数据库连接,提高性能和资源利用率。
    • 缓存:在需要缓存数据的场景中,使用单例模式可以确保只有一个缓存实例,方便统一管理和操作缓存数据。
    • 线程池:在需要管理线程的场景中,使用单例模式可以确保只有一个线程池实例,方便统一管理和调度线程任务。

除了上述应用场景,单例模式在许多其他情况下也有应用。它可以提供全局的访问点,方便对实例进行控制和操作。同时,单例模式还可以节省系统资源,避免创建过多的实例。

需要注意的是,单例模式可能会造成全局状态的存在,增加了程序的耦合性。因此,在使用单例模式时需要慎重考虑,确保真正需要全局唯一实例的场景才使用。此外,如果单例类的实例需要进行资源释放或销毁,需要额外考虑实现方式,以免造成资源泄露或内存泄露的问题。

相关文章:

【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资源创建完成后立即暂停更新过程,此时,仅存在一部分新版本的应用,主体部分还是旧的版本。然后&#xf…...

百度Comate SaaS版本正式发布,助力开发者加速研发过程

百度Comate是基于文心大模型的智能代码助手,让开发者的编码更快、更好、更简单,为开发者自动生成完整的、且更符合实际研发场景的代码行或整个代码块,帮助每一位开发者轻松完成研发任务。10月17日召开的百度世界大会上,百度CTO王海…...

8类放球问题

放球问题简介 放球问题是一类很有意思的排列组合问题。通俗来说,就是把n个小球放到m个盒子里,问有几种放法。根据小球是否相同,盒子是否相同,是否允许有空盒,又可以把问题细分为8个具体的问题。其中有一些问题是非常简…...

【APP VTable】和市面上的 Table 组件一样,都是接收表格[] 以及数据源[]

博主&#xff1a;_LJaXi Or 東方幻想郷 专栏&#xff1a; uni-app | 小程序开发 开发工具&#xff1a;HBuilderX 这里写目录标题 表格组件USE 表格组件 <template><view class"scroll-table-wrapper"><view class"scroll-table-container"…...

深度学习 anaconda 安装问题

配置anaconda 在官网下载匹配版本的anaconda&#xff08;官网下载可能时间比较长&#xff09;&#xff0c;可以选择清华镜像。 安装过程默认即可&#xff0c;或者根据情况进行修改。 旧版本是可以在安装的时候勾选添加路径到环境变量中的&#xff0c;但是我安装的是2023.9月…...

为什么现在学Rust编程是最好时机?

1.摘要 Rust是由Mozilla主导开发的通用、编译型编程语言。设计准则为:安全、并发、实用,支持函数式、并发式、过程式以及面向对象的编程风格。Rust的设计目标之一,是要使设计大型的互联网客户端和服务器的任务变得更容易,因此更加强调安全性、存储器配置以及并发处理等方面的特…...

Java——Spring的控制反转(一文详解IOC)

Spring&#xff0c;Spring MVC&#xff0c;Spring Boot 三者比较 答&#xff1a; 这三者专注的领域不同&#xff0c;解决的问题也不一样&#xff1b;总的来说&#xff0c;Spring 就像一个大家族&#xff0c;有众多衍生产品例如 Boot&#xff0c;Security&#xff0c;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输入框怎么限制只输入空格或者回车时不能提交

项目场景&#xff1a; 项目相关背景&#xff1a; tinymce输入框只输入空格或者回车时提交的空数据毫无意义&#xff0c;所以需要限制一下 无意义的输入&#xff1a; 解决方案&#xff1a; 因为tinymce输入框传到后端的数据是代码形式&#xff0c;所以不能直接.trem&#…...

时间、空间复杂度的例题详解

文章前言 上篇文章带大家认识了数据结构和算法的含义&#xff0c;以及理解了时间、空间复杂度&#xff0c;那么接下来来深入理解一下时间、空间复杂度。 时间复杂度实例 实例1 // 计算Func2的时间复杂度&#xff1f; void Func2(int N) {int count 0;for (int k 0; k <…...

Ubuntu22.04 搭建 OpenHarmony 命令行开发环境

文章目录 简介安装工具链获取gitee源码安装编译工具编译测试 简介 在本文中&#xff0c;我们将介绍如何使用命令行工具在你的设备上安装OpenHarmony操作系统。OpenHarmony是一个开源的、面向物联网&#xff08;IoT&#xff09;设备的操作系统&#xff0c;它提供了一套全面的开…...

10.27 知识总结(前端)

一、 前端 1.1 什么是前端&#xff1f; 前端是所有跟用户直接打交道的都可以称之为是前端 比如&#xff1a;PC页面、手机页面、平板页面、汽车显示屏、大屏幕展示出来的都是前端内容 通俗点就是能够用肉眼看到的都是“前端” 1.2 为什么要学前端 学了前端以后我们就可以做全栈工…...

操作系统(02326)考试题库

博客主页&#xff1a;https://tomcat.blog.csdn.net 博主昵称&#xff1a;农民工老王 主要领域&#xff1a;Java、Linux、K8S 期待大家的关注&#x1f496;点赞&#x1f44d;收藏⭐留言&#x1f4ac; 目录 单选题多选题主观题 单选题 把并发进程中与共享变量有关的程序段称为…...

LeetCode题:70爬楼梯,126斐波那契数

目录 70&#xff1a;爬楼梯 题目要求&#xff1a; 解题思路&#xff1a;&#xff08;类似斐波那契数&#xff09; 递归解法&#xff1a; 非递归解法&#xff1a; 126&#xff1a;斐波那契数 题目要求&#xff1a; 解题思路&#xff1a; 递归解法&#xff1a; 非递归解…...

VTK OrientationMarker 方向 三维坐标系 相机坐标轴 自定义坐标轴

本文 以 Python 语言开发 我们在做三维软件开发时&#xff0c;经常会用到相机坐标轴&#xff0c;来指示当前空间位置&#xff1b; 坐标轴效果&#xff1a; 相机方向坐标轴 Cube 正方体坐标轴 自定义坐标轴&#xff1a; Code&#xff1a; Axes def main():colors vtkNamedC…...

OpenClaw技能共享:将自研的Phi-3-vision-128k-instruct图表分析模块发布到ClawHub

OpenClaw技能共享&#xff1a;将自研的Phi-3-vision-128k-instruct图表分析模块发布到ClawHub 1. 为什么需要共享技能 去年我在处理一批市场分析报告时&#xff0c;发现手动从PDF中提取图表数据再制作可视化报表的效率极低。当时用OpenClawPhi-3-vision模型搭建了一个自动化分…...

Mac 安装 Java JDK 完整教程:一篇文章讲透安装、配置、多版本管理

一、Java JDK 详解1.1 什么是 JDK&#xff1f;JDK&#xff08;Java Development Kit&#xff0c;Java 开发工具包&#xff09;是 Oracle 公司提供的用于 Java 程序开发的完整软件包。它是 Java 开发者不可或缺的核心工具&#xff0c;包含了编写、编译、调试和运行 Java 程序所需…...

5步搞定Jimeng LoRA测试台:Streamlit界面,LoRA版本智能排序

5步搞定Jimeng LoRA测试台&#xff1a;Streamlit界面&#xff0c;LoRA版本智能排序 1. 项目概述&#xff1a;轻量级LoRA测试系统 Jimeng LoRA测试台是一款专为模型开发者设计的轻量化文本生成图像系统。它基于Z-Image-Turbo文生图底座&#xff0c;实现了动态多版本LoRA热切换…...

Windows双网卡路由配置实战:内外网高效并行访问指南

1. 为什么需要双网卡并行访问内外网&#xff1f; 在企业办公环境中&#xff0c;我们经常遇到这样的场景&#xff1a;电脑需要同时连接内网处理公司业务系统&#xff0c;又要访问外网查询资料或使用云服务。如果频繁切换网络&#xff0c;不仅效率低下&#xff0c;还可能因为操作…...

乙巳马年春联生成终端效果展示:扫码下载功能在微信生态中的无缝流转

乙巳马年春联生成终端效果展示&#xff1a;扫码下载功能在微信生态中的无缝流转 1. 引言&#xff1a;当传统年俗遇见现代科技 春节贴春联&#xff0c;是刻在我们文化基因里的仪式感。但你想过吗&#xff0c;这个传承千年的习俗&#xff0c;也能和今天最前沿的AI技术碰撞出火花…...

Win11终极IPX协议兼容方案:IPXWrapper完整配置与优化指南

Win11终极IPX协议兼容方案&#xff1a;IPXWrapper完整配置与优化指南 【免费下载链接】ipxwrapper 项目地址: https://gitcode.com/gh_mirrors/ip/ipxwrapper 在现代Windows 11系统上重温《星际争霸》、《魔兽争霸》、《暗黑破坏神2》等经典游戏时&#xff0c;你是否遇…...

【KS-Downloader】快手无水印内容获取开源工具技术解析

【KS-Downloader】快手无水印内容获取开源工具技术解析 【免费下载链接】KS-Downloader 快手&#xff08;KuaiShou&#xff09;视频/图片下载工具&#xff1b;数据采集工具 项目地址: https://gitcode.com/gh_mirrors/ks/KS-Downloader 在短视频内容创作领域&#xff0c…...

革新性STL文件管理工具:让3D模型预览效率提升80%的Windows解决方案

革新性STL文件管理工具&#xff1a;让3D模型预览效率提升80%的Windows解决方案 【免费下载链接】STL-thumbnail Shellextension for Windows File Explorer to show STL thumbnails 项目地址: https://gitcode.com/gh_mirrors/st/STL-thumbnail 问题发现&#xff1a;3D设…...

基于CubeMX与HAL库:STM32F302串口重定向Printf的工程化实践

1. 为什么需要串口重定向Printf 在嵌入式开发中&#xff0c;调试信息输出是排查问题的生命线。想象一下你正在调试一个复杂的传感器数据采集系统&#xff0c;突然发现数据异常&#xff0c;这时候如果能像在PC上编程一样直接printf("当前温度值&#xff1a;%f", temp…...

YOLOv8鹰眼目标检测实战:一键部署,实时识别80种物体(附WebUI)

YOLOv8鹰眼目标检测实战&#xff1a;一键部署&#xff0c;实时识别80种物体&#xff08;附WebUI&#xff09; 1. 项目概述 1.1 什么是YOLOv8鹰眼目标检测 YOLOv8鹰眼目标检测是基于Ultralytics最新YOLOv8模型的工业级解决方案。它能够在毫秒级别完成图像中多达80类物体的识别…...