设计模式--单例模式

embedded/2024/9/20 7:26:41/ 标签: 单例模式, 设计模式

单例模式是一种常用的软件设计模式,它确保一个类只有一个实例,并提供一个全局访问点。这种模式经常用于系统中只需要一个实例的对象,例如日志管理器、数据库连接池、线程池等。
下面是几种常见的单例模式实现方式:

  1. 懒汉式(线程不安全)
    这是最简单的实现方式,但是它不是线程安全的。如果多个线程同时访问 getInstance 方法,可能会创建多个实例。
public class Singleton {private static Singleton instance;private Singleton() {}public static Singleton getInstance() {if (instance == null) {instance = new Singleton();}return instance;}
}
  1. 懒汉式(线程安全)
    为了保证线程安全,可以在 getInstance 方法上加 synchronized 关键字,但这样会导致性能下降。
public class Singleton {private static Singleton instance;private Singleton() {}public static synchronized Singleton getInstance() {if (instance == null) {instance = new Singleton();}return instance;}
}
  1. 双重检查锁定(DCL)
    双重检查锁定是懒汉式的优化版本,它既保证了线程安全又提高了效率。
public class Singleton {private volatile static Singleton instance;private Singleton() {}public static Singleton getInstance() {if (instance == null) {synchronized (Singleton.class) {if (instance == null) {instance = new Singleton();}}}return instance;}
}
  1. 饿汉式
    这种方式在类加载时就完成了初始化,避免了线程同步问题,但可能会导致在类加载时初始化实例造成资源浪费。
public class Singleton {private static final Singleton instance = new Singleton();private Singleton() {}public static Singleton getInstance() {return instance;}
}
  1. 静态内部类
    这种方式利用了 Java 类加载机制保证初始化实例时只有一个线程,既实现了线程安全,又实现了延迟加载。
public class Singleton {private Singleton() {}private static class SingletonHolder {private static final Singleton INSTANCE = new Singleton();}public static Singleton getInstance() {return SingletonHolder.INSTANCE;}
}

每种实现方式都有其优缺点,在选择时可以根据实际需求进行考虑。例如,如果你的应用程序是多线程环境并且希望实例在第一次使用时创建,那么可以采用双重检查锁定的方式;如果你的应用程序是单线程环境,那么简单的懒汉式实现就足够了。


http://www.ppmy.cn/embedded/97276.html

相关文章

SQL - 事务

事务是代表单个工作单元的一组SQL语句,当我们需要对数据库进行多次更改的情况下,要使用事务,我们希望所有这些更改作为一个单元一起成功或失败事务属性 (ACID) 原子性(Atomicity):事务中的所有操作要么全部完成,要么全…

群晖NAS本地搭建可远程交互的大型语言模型LLM聊天机器人

文章目录 前言1. 拉取相关的Docker镜像2. 运行Ollama 镜像3. 运行Chatbot Ollama镜像4. 本地访问5. 群晖安装Cpolar6. 配置公网地址7. 公网访问8. 固定公网地址 前言 本文主要分享如何在群晖NAS本地部署并运行一个基于大语言模型Llama 2的个人本地聊天机器人并结合内网穿透工具…

elasticsearch的高亮查询三种模式查询及可能存在的问题

目录 高亮查询使用介绍 高亮参数 三种分析器 可能存在的查询问题 fvh查询时出现StringIndexOutOfBoundsException越界 检索高亮不正确 参考文档 高亮查询使用介绍 Elasticsearch 的高亮(highlight)可以从搜索结果中的一个或多个字段中获取突出显…

使用Requests库发送GET和POST请求的实用指南

使用Requests库发送GET和POST请求的实用指南 在现代Web开发和数据分析中,HTTP请求是与Web服务和API交互的基本方式。Python的requests库是一个强大且易于使用的HTTP库,能够简化发送HTTP请求的过程。本文将详细介绍如何使用requests库发送GET和POST请求,包括基本用法、参数传…

mysql Ubuntu安装与远程连接配置

一、安装(Ubuntu22环境安装mysql8) 这里使用Xshell链接Ubuntu和mysql windows进行操作,特别提醒:安装之前建议对Ubuntu快照处理备份,避免安装中出错导致Ubuntu崩溃。 查看是否安装的有可以用指令:ps -ef|…

Unity3D 自定义窗口

Unity3D 自定义窗口的实现。 自定义窗口 Unity3D 可以通过编写代码,扩展编辑器的菜单栏和窗口。 简单的功能可以直接一个菜单按钮实现,复杂的功能就需要绘制一个窗口展示更多的信息。 编辑器扩展的脚本,需要放在 Editor 文件夹中。 菜单栏…

深入浅出:你需要了解的用户数据报协议(UDP)

文章目录 **UDP概述****1. 无连接性****2. 尽最大努力交付****3. 面向报文****4. 多种交互通信支持****5. 较少的首部开销** **UDP报文的首部格式****详细解释每个字段** **UDP的多路分用模型****多路分用的实际应用** **检验和的计算方法****伪首部的详细内容****检验和计算步…

Java面试题———RabbitMQ篇

目录 1.你们项目中哪里用到了RabbitMQ 2、为什么会选择使用RabbitMQ 3、使用RabbitMQ如何保证消息不丢失 4、消息的重复消费问题如何解决的 5、如何解决消息堆积在MQ的问题 6、RabbitMQ如何保证消费的顺序性 7、RabbitMQ的延迟队列有了解过嘛 8、RabbitMQ如何设置消息过…

操作DOM和事件处理:与用户交互

在现代网页开发中,与用户交互是至关重要的一部分。通过操作DOM元素和处理用户事件,我们可以让网页变得更加动态和响应。本文将通过一个制作动态待办事项列表的案例,帮助你掌握DOM选择器、事件监听器和事件处理的基本知识。 任务目标 通过本教程,你将学习并掌握: 使用DOM…

CentOS 7安装流程详细教程

CentOS 7安装流程详细教程 CentOS(Community Enterprise Operating System)是基于Red Hat Enterprise Linux(RHEL)源代码重新编译而成的免费开源操作系统,广泛用于服务器和企业环境。由于其稳定性和兼容性&#xff0c…

Eureka入门指南:微服务注册与发现的基础概念

Eureka入门指南:微服务注册与发现的基础概念 引言 随着微服务架构的普及,微服务之间的高效通信和管理成为了开发和运维的核心挑战之一。为了解决服务发现和管理问题,Netflix推出了Eureka,一个功能强大的服务注册和发现工具。Eur…

【区块链+金融服务】企链通金融服务平台 | FISCO BCOS应用案例

据供应链行业观察不完全统计,2021 年共有 93 家各类供应链金融平台上线、启动、落地首笔业务或完成系统招 标。为适应跟上供应链金融行业的发展,深圳市企企通科技有限公司积极响应国家政策,为企业引入基于 FISCO BCOS 区块链技术的供应链金融…

QT中Charts基本用法

QT中Charts基本用法 第一步:创建工程,添加Charts库 第二步:添加charts视图 注意要打上对钩 第三步:添加所需成员 第四步:编写初始化函数 第五步:添加测试数据

Spring中SimpleJndiBeanFactory

SimpleJndiBeanFactory 是 Spring Framework 早期版本中的一个类,用于提供对 JNDI(Java Naming and Directory Interface)资源的简单访问。JNDI 是 Java EE 中的一个标准 API,允许 Java 应用程序访问命名和目录服务,如…

Mongodb、redis、mysql、mssql、oracle、PostgreSQL服务简介和默认运行端口

MongoDB 简介: MongoDB 是一个开源的 NoSQL 文档数据库,使用类似 JSON 的 BSON 格式存储数据。它是一个高性能、高可用、自动伸缩的分布式数据库。默认端口: 27017 Redis 简介: Redis 是一个开源的内存数据库,常用作缓存和消息队列代理。它支持多种数据结构,如字符串、哈希、列…

★ C++基础篇 ★ vector 类

Ciallo&#xff5e;(∠・ω< )⌒☆ ~ 今天&#xff0c;我将继续和大家一起学习C基础篇第六章----vector类 ~ 目录 一 vector的介绍及使用 1.1 vector的介绍 1.2 vector的使用 1.2.1 vector的定义 1.2.2 vector iterator 的使用 1.2.3 vector 空间增长问题 1.2.4 vecto…

Etcd:分布式键值存储的基石

Etcd 是一个分布式的、一致性的键值存储系统&#xff0c;由 CoreOS 设计并开源。它主要用于共享配置和服务发现&#xff0c;并且被广泛应用于 Kubernetes、Docker 和其他云原生工具中作为核心组件之一。Etcd 使用 Raft 一致性算法来保证数据的一致性&#xff0c;使得它非常适合…

C语言 | Leetcode C语言题解之第347题前K个高频元素

题目&#xff1a; 题解&#xff1a; struct hash_table {int key;int val;// 查看 https://troydhanson.github.io/uthash/ 了解更多UT_hash_handle hh; };typedef struct hash_table* hash_ptr;struct pair {int first;int second; };void swap(struct pair* a, struct pair*…

NFS实现多服务器文件的共享

文章目录 一、简介二、部署1、准备1、服务端和客户端&#xff1a;安装nfs-utils2、服务端&#xff1a;创建共享目录3、服务端&#xff1a;配置exports文件4、客户端挂载5、客户端&#xff1a;卸载 三、附录1、NFS服务基本命令2、/etc/exports参数解释3、exportfs命令 参考资料 …

IP SSL证书快速申请教程

在互联网安全领域中&#xff0c;SSL证书是比较普遍的传输数据加密方式之一。SSL证书通过建立加密通道&#xff0c;确保客户端与服务器之间传输的数据不被第三方窃取或篡改。而大多数SSL证书&#xff0c;如单域名SSL证书、多域名SSL证书以及通配符SSL证书&#xff0c;在申请时必…