<设计模式> 单例模式

单例模式

  • 模式介绍:保证一个类仅有一个实例,并提供一个全局访问点来获取这个唯一的实例。
  • 主要解决:一个全局使用的类频繁地创建与销毁。
  • 关键代码:构造函数是私有的。

应用场景

  • 数据库连接池:数据库连接是一种宝贵的资源,频繁地创建和销毁数据库连接会带来巨大的性能损耗。通过使用单例模式,可以确保整个应用程序中只有一个数据库连接池实例,这个实例负责维护和管理数据库连接,从而避免重复创建和销毁连接,提高数据库操作的效率。
  • 缓存系统:在应用程序中,缓存系统是一个重要的组件,用于存储和快速访问常用的数据。通过使用单例模式,可以确保整个应用程序中只有一个缓存实例,这个实例负责存储和管理缓存数据,从而避免数据不一致和重复创建缓存对象的问题。
  • 日志记录:在应用程序中,日志记录是一种常见的调试和错误追踪手段。为了确保日志信息的完整性和一致性,可以使用单例模式来创建一个日志记录类,确保整个应用程序中只有一个日志记录实例,这样所有的日志信息都会通过这个实例来记录和管理。
  • 配置文件读取:配置文件通常包含应用程序的一些重要参数和设置,如数据库连接信息、API密钥等。为了方便地读取和管理这些配置信息,可以使用单例模式来创建一个配置管理类,确保整个应用程序中只有一个配置管理实例,这个实例负责读取和解析配置文件,并提供配置信息的访问接口。
  • GUI组件:在图形用户界面(GUI)开发中,有些组件可能只需要一个实例就足够了,比如主窗口、对话框等。通过使用单例模式,可以确保在整个应用程序中只有一个这样的GUI组件实例,从而避免重复创建和显示相同的组件。
  • 任务管理器、回收站等系统工具:在操作系统中,任务管理器、回收站等工具通常也采用单例模式实现。这是因为这些工具在整个系统运行过程中只需要一个实例就足够了,它们负责管理系统资源、监控进程和文件等任务。
  • 网站计数器:在网站开发中,计数器用于记录网站的访问量、用户数量等信息。由于这些信息需要全局共享和实时更新,因此可以使用单例模式来创建一个计数器类,确保整个网站中只有一个计数器实例,从而避免数据不一致和重复计算的问题。
  • 全局状态管理:在需要共享全局状态或数据的场景中,可以使用单例模式来创建一个全局状态管理类。这个类负责管理和维护全局状态或数据,并提供访问和修改这些状态或数据的接口。这样,在不同的地方就可以方便地访问和修改全局状态或数据了。

代码实现

1、懒汉式,线程不安全

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

2、懒汉式,线程安全
描述:这种方式具备很好的 lazy loading,能够在多线程中很好的工作,但是,效率很低,99% 情况下不需要同步。优点:第一次调用才初始化,避免内存浪费。缺点:必须加锁 synchronized 才能保证单例,但加锁会影响效率。getInstance() 的性能对应用程序不是很关键(该方法使用不太频繁)。

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

3、饿汉式
描述:这种方式比较常用,但容易产生垃圾对象。优点:没有加锁,执行效率会提高。缺点:类加载时就初始化,浪费内存。

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

4、双检锁/双重校验锁(DCL,即 double-checked locking)
描述:这种方式采用双锁机制,安全且在多线程情况下能保持高性能。getInstance() 的性能对应用程序很关键。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/50479.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Netty的源码分析和业务场景

Netty 是一个高性能、异步事件驱动的网络应用框架,它基于 Java NIO 构建,广泛应用于互联网、大数据、游戏开发、通信行业等多个领域。以下是对 Netty 的源码分析、业务场景的详细介绍: 源码概述 Netty 的核心组件:Netty 的架构设…

Linux 安装mysql-client-core-8.0

在Linux上安装mysql-client-core-8.0 安装流程 下面是安装mysql-client-core-8.0的步骤和相应的命令: 步骤1:更新系统软件源 我们首先需要更新系统的软件源,以确保我们能够获取到最新的软件包列表。使用以下命令更新软件源: …

Ansible——inventory 主机清单

1、inventory 含义 Inventory支持对主机进行分组,每个组内可以定义多个主机,每个主机都可以定义在任何一个或多个主机组内。 如果是名称类似的主机,可以使用列表的方式标识各个主机。 vim /etc/ansible/hosts [webservers] 192.168.20.11:222…

平凯星辰亮相 2024 中国国际金融展,发布银行交易明细查询白皮书

7 月 19 日至 21 日,备受瞩目的 2024 中国国际金融展(以下简称金融展)在北京国家会议中心隆重举办。作为中国乃至亚洲最大的金融科技展会,本届金融展以“数字金融引领未来,守正创新共筑金融新生态”为主题,…

vue单页面 全屏 使用 screenfull 实现全屏(左侧菜单栏隐藏)

vue单页面 全屏 使用 screenfull 实现全屏(左侧菜单栏隐藏)_vue在打开一个界面的时候隐藏侧边栏-CSDN博客

C++_单例模式

目录 1、饿汉方式实现单例 2、懒汉方式实现单例 3、单例模式的总结 结语 前言: 在C中有许多设计模式,单例模式就是其中的一种,该模式主要针对类而设计,确保在一个进程下该类只能实例化出一个对象,因此名为单例。而…

temu数据分析怎么做,temu选品数据分析怎么做

在竞争激烈的电商市场中,数据分析已成为商家提升销售业绩、优化经营策略的重要工具。特别是对于Temu平台的卖家而言,掌握数据分析技巧,特别是选品数据分析,更是至关重要。本文将为您详细解析如何在Temu平台上进行数据分析&#xf…

Docker 安全及日志管理(包含SSL证书)

目录 一、Docker 存在的安全问题 二、Docker 架构缺陷与安全机制 三、Docker 安全基线标准 四、容器相关的常用安全配置方法 五、限制流量流向 六、镜像安全 七、DockerClient 端与 DockerDaemon 的通信安全 https的单向认证流程 https的双向认证流程 八、DockerClie…

子组件不能直接改变父组件传递的“道具”值

引言: 不少人在刚开始使用vue时都会遇到一个报错——Avoid mutating a prop directly since the value will be overwritten whenever the parent component re-renders. Instead, use a data or computed property based on the props value.(避免直接改…

Ubuntu 22.04.4 LTS (linux) GoAccess 分析 Nginx 日志

1 安装goaccess sudo apt-get update sudo apt-get install goaccess 2 控制台运行 goaccess -a -d -f /usr/local/openresty/nginx/logs/access.log -p /etc/goaccess/goaccess.conf #sudo vim /etc/goaccess/goaccess.conf time-format %H:%M:%S date-format %d/%b…

iOS ------ Block的相关问题

Block的定义 Block可以截获局部变量的匿名函数&#xff0c; 是将函数及其执行上下文封装起来的对象。 Block的实现 通过Clang将以下的OC代码转化为C代码 // Clang xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc main.m//main.m #import <Foundation/Foundation.…

3.2、数据结构-数组、矩阵和广义表

数组结构 数组是定长线性表在维度上的扩展,即线性表中的元素又是一个线性表。N维数组是一种“同构”的数据结构,其每个数据元素类型相同、结构一致。 一个m行n列的数组表示如下: 其可以表示为行向量形式&#xff08;一行一行的数据&#xff09;或者列向量形式&#xff08;一…

前端开发使用Big.js精算避免误差

1、下载 npm install big.js 全局引入还是局部引入可根据项目框架及个人需求 2、静态引入 < script src https://unpkg.com/big.js6.0.0/big.mjs > </ script > 或者 import Big from https://raw.githubusercontent.com/mikemcl/big.js/v6.0.0/big.mjs; i…

Nginx 怎样处理请求的故障转移?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01; 文章目录 Nginx 怎样处理请求的故障转移&#xff1f;一、理解故障转移的重要性二、Nginx 中的故障检测机制三、Nginx 中的请求分配策略四、Nginx 中的故障转移实现方式五、…

Shell脚本编程(一)

目录 一、Shell命令行的书写规则 二、编写/修改权限及执行shell程序的步骤 1、编写简单Shell程序 2、建立可执行程序 3、执行Shell程序 4、实例 三、Shell程序中使用参数 1、位置参数 2、内部参数 3、实例一 4、实例二 一、Shell命令行的书写规则 在执行Shell命令时…

搭建本地私有知识问答系统:MaxKB + Ollama + Llama3 (wsl网络代理配置、MaxKB-API访问配置)

目录 搭建本地私有知识问答系统:MaxKB、Ollama 和 Llama3 实现指南引言MaxKB+Ollama+Llama 3 Start buildingMaxKB 简介:1.1、docker部署 MaxKB(方法一)1.1.1、启用wls或是开启Hyper使用 WSL 2 的优势1.1.2、安装docker1.1.3、docker部署 MaxKB (Max Knowledge Base)MaxKB …

便携式气象仪:科技赋能,让气象观测更智能

随着科技的快速发展&#xff0c;越来越多的领域受益于技术的进步。其中&#xff0c;气象观测领域也不例外。传统的气象观测设备虽然精确可靠&#xff0c;但往往体积庞大、携带不便&#xff0c;且需要专业人员进行操作和维护。而便携式气象仪的出现&#xff0c;则打破了这一局限…

在WPF中使用WebView2详解

Microsoft Edge WebView2 Microsoft Edge WebView2 控件允许在本机应用中嵌入 web 技术(HTML、CSS 以及 JavaScript)。 WebView2 控件使用 Microsoft Edge 作为绘制引擎&#xff0c;以在本机应用中显示 web 内容。 使用 WebView2 可以在本机应用的不同部分嵌入 Web 代码&…

Golang | Leetcode Golang题解之第284题窥视迭代器

题目&#xff1a; 题解&#xff1a; type PeekingIterator struct {iter *Iterator_hasNext bool_next int }func Constructor(iter *Iterator) *PeekingIterator {return &PeekingIterator{iter, iter.hasNext(), iter.next()} }func (it *PeekingIterator) hasNe…

宿州市各区县两化融合贯标申请认定奖补奖励和认定条件、材料、周期、流程大全

本文将为大家盘点宿州市各区县两化融合贯标申请认定奖补奖励和认定条件、材料、周期、流程等内容&#xff0c;详情如下&#xff0c;埇桥区、砀山县、萧县、灵璧县、泗县需要申报的可指导&#xff01; 宿州市各区县两化融合贯标申请认定奖补奖励&#xff08;仅供参考&#xff0…