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

用Rust实现23种设计模式之单例

话不多说,上代码!

1. 使用Arc + Mutex

在这个例子中,我们使用了 Arc (原子引用计数)和 Mutex (互斥锁)来实现线程安全的单例。通过 get_instance 方法,我们可以获取到单例实例,并对实例进行操作。

use std::sync::{Arc, Mutex};struct Singleton {// 单例数据data: String,
}impl Singleton {// 获取单例实例的方法fn get_instance() -> Arc<Mutex<Singleton>> {// 使用懒加载创建单例实例// 这里使用了 Arc 和 Mutex 来实现线程安全的单例// 只有第一次调用 get_instance 时会创建实例,之后都会返回已创建的实例static mut INSTANCE: Option<Arc<Mutex<Singleton>>> = None;unsafe {INSTANCE.get_or_insert_with(|| {Arc::new(Mutex::new(Singleton {data: String::from("Singleton instance"),}))}).clone()}}
}fn main() {// 获取单例实例let instance1 = Singleton::get_instance();let instance2 = Singleton::get_instance();// 修改单例数据{let mut instance = instance1.lock().unwrap();instance.data = String::from("Modified singleton instance");}// 输出单例数据{let instance = instance2.lock().unwrap();println!("{}", instance.data);}
}

2. 使用lazy_static的懒加载

使用 lazy_static crate: lazy_static crate 是一个常用的 Rust crate,可以实现懒加载的全局静态变量。通过 lazy_static ,可以在需要时创建单例实例,并确保只有一个实例被创建

use lazy_static::lazy_static;use std::sync::Mutex;struct Singleton {// 单例数据data: String,}lazy_static! {static ref INSTANCE: Mutex<Singleton> = Mutex::new(Singleton {data: String::from("Singleton instance"),});}fn main() {// 获取单例实例let instance = INSTANCE.lock().unwrap();println!("{}", instance.data);}

3. 使用once_cell crate

使用 once_cell crate: once_cell crate 是另一个常用的 Rust crate,可以实现懒加载的全局静态变量。通过 once_cell ,可以在首次访问时创建单例实例,并确保只有一个实例被创建

use once_cell::sync::Lazy;struct Singleton {// 单例数据data: String,}static INSTANCE: Lazy<Singleton> = Lazy::new(|| Singleton {data: String::from("Singleton instance"),});fn main() {// 获取单例实例let instance = INSTANCE.clone();println!("{}", instance.data);}

4. 使用 Rc 和 RefCell

使用 Rc 和 RefCell : Rc 是 Rust 标准库中的引用计数类型, RefCell 是一个提供内部可变性的类型。结合使用 Rc 和 RefCell ,可以实现简单的单例模式。示例代码如下:

use std::rc::Rc;use std::cell::RefCell;struct Singleton {// 单例数据data: String,}fn main() {// 创建单例实例let instance = Rc::new(RefCell::new(Singleton {data: String::from("Singleton instance"),}));// 获取单例实例let borrowed_instance = instance.borrow();println!("{}", borrowed_instance.data);}	

相关文章:

用Rust实现23种设计模式之单例

话不多说&#xff0c;上代码&#xff01; 1. 使用Arc Mutex 在这个例子中&#xff0c;我们使用了 Arc &#xff08;原子引用计数&#xff09;和 Mutex &#xff08;互斥锁&#xff09;来实现线程安全的单例。通过 get_instance 方法&#xff0c;我们可以获取到单例实例&…...

小米平板6将推14英寸版!与MIX Fold 3同步推出

今天&#xff0c;知名数码博主数码闲聊站爆料消息&#xff0c;称小米平板6将推出一款Max版本&#xff0c;预计与小米MIX Fold 3同步推出。 据介绍&#xff0c;小米平板6 Max将是小米首款14英寸大屏的旗舰平板&#xff0c;平板搭载骁龙8处理器&#xff0c;在性能释放、影音表现、…...

webpack 的一点知识

多个入口共享多个模块 在使用webpack搭建多页面应用时候需要多个入口&#xff0c;这个时候需要考虑到模块共享问题了 可以使用entry.dependOn 来处理 entry: {home: {import: "./pages/home/index.js",// 其中vendors里边使用到模块&#xff0c;不会打入home对应的…...

Python 双目摄像机控制(windows + linux)

一、Windows 下载 Download libusb-win32-devel-filter-1.2.6.0.exe (libusb-win32) 安装&#xff0c;在弹出框中选择摄像机usb设备 pip install pyusb pip install libusb 代码如下&#xff0c;注意如果报错要以管理员权限运行&#xff1a; import cv2 import usb.corecam…...

mybatisplus实现自动填充 时间

mybatisplus实现自动填充功能——自动填充时间 数据库表中的字段 创建时间 (createTime)更新时间 (updateTime) 每次 增删改查的时候&#xff0c;需要通过对Entity的字段&#xff08;createTime&#xff0c;updateTime&#xff09;进行set设置&#xff0c;但是&#xff0c;每…...

P5732 【深基5.习7】杨辉三角

题目描述 给出 n ( n ≤ 20 ) n(n\le20) n(n≤20)&#xff0c;输出杨辉三角的前 n n n 行。 如果你不知道什么是杨辉三角&#xff0c;可以观察样例找找规律。 输入格式 输出格式 样例 #1 样例输入 #1 6样例输出 #1 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 11.题目…...

ubuntu调整路由顺序

Ubuntu系统跳转路由顺序 1、安装ifmetric sudo apt install ifmetric2、查看路由 route -n3、把Iface下面的eth1调到第一位 sudo ifmetric eth1 0命令中eth1是网卡的名称&#xff0c;更改网卡eth1的跃点数&#xff08;metric值&#xff09;为0&#xff08;数值越小&#xf…...

集成学习算法是什么?如何理解集成学习?

什么是集成学习&#xff1f; 集成学习通过建立几个模型来解决单一预测问题。它的工作原理是生成多个分类器/模型&#xff0c;各自独立地学习和作出预测。这些预测最后结合成组合预测&#xff0c;因此优于任何一个单分类的做出预测。 机器学习的两个核心任务 任务一&#xff1…...

npm配置最新淘宝镜像

目录 1、设置淘宝镜像2、查看源 1、设置淘宝镜像 默认的官方镜像&#xff1a;https://registry.npmjs.org&#xff0c;切换国内淘宝镜像&#xff0c;访问下载更快。 npm config set registry https://registry.npmmirror.com/其他&#xff0c;如pnpm&#xff1a; pnpm confi…...

网络基础1

文章目录 网络基础11. 计算机网络背景1.1 网路发展1.2 认识 "协议" 2. 网络协议初识2.1 协议分层2.2 OSI七层模型2.3 TCP/IP五层(或四层)模型协议栈与OS的关系 3. 网络传输基本流程3.1 同一个局域网两台主机通信3.2 同一个路由器的两个子网通信 4. 网络中的地址管理4…...

2023年电赛---运动目标控制与自动追踪系统(E题)发挥题思路

前言 &#xff08;1&#xff09;因为博客编辑字数超过1W字会导致MD编辑器非常卡顿。所以我将发挥题和基础题的思路拆开了。 &#xff08;2&#xff09;更新日记&#xff1a; <1>2023年8月4日&#xff0c;9点20分。分离发挥题思路和基础题思路&#xff0c;增加了博主Huiye…...

61 # http 数据处理

node 中的核心模块 http 可以快速的创建一个 web 服务 const http require("http"); const url require("url");// req > request 客户端的所有信息 // res > respone 可以给客户端写入数据 const server http.createServer();server.on("r…...

模版下载和Excel文件导入

模版下载 模版下载 模版下载 /*** 生成模版** param* return AppResponse*/public AppResponse ExcelFile() throws IOException {// 创建一个新的Excel工作簿Workbook workbook new XSSFWorkbook();// 创建一个工作表Sheet sheet workbook.createSheet("页面拨测模板&…...

Datax 数据同步-使用总结(一)

1&#xff0c;实时同步&#xff1f; datax 通常做离线数据同步使用。 目前能想到的方案 利用 linux 的定时任务时间戳的方式做增量同步。 2&#xff0c;同步速度快不快&#xff1f; 单表同步速度还是挺快的 但是如果遇到复杂的 sql 查询&#xff0c;其同步效率&#xff0c…...

代码随想录算法训练营第九天| 232.用栈实现队列,225.用队列实现栈

232. 用栈实现队列 232.用栈实现队列 这里用两个栈来模拟队列以此实现队列的先进先出&#xff0c; 注意点 1.dump()方法将stackin的元素移入到stackout的操作&#xff0c;是要将stackin的全部元素放到stackout中&#xff0c;所以用while循环判断 stackIn是否为空 2.新建栈…...

求解二次方程

描述 编写一个程序&#xff0c;实现求解形如ax^2 bx c 0的二次方程的根。要求使用三个函数分别计算b^2 - 4ac大于0、等于0和小于0时的根&#xff0c;并在主函数中输出结果。 输入 输入三个浮点数a、b和c&#xff0c;分别表示二次方程的系数。 输出 输出二次方程的根&am…...

【hive 运维】hive注释/数据支持中文

文章目录 一. 设置mysql中的hive库二. hive-site.xml 设置三. 测试 hive支持中文需要关注两个方面&#xff1a; 设置hive 元数据库中的一些表设置hive-site.xml. 一. 设置mysql中的hive库 use hivedb; alter table TBLS modify column TBL_NAME varchar(1000) character se…...

架构,性能和游戏 《游戏编程模式》学习笔记

开新坑&#xff0c;准备把《游戏编程模式》这本书啃完。这是一本讲设计模式的书&#xff0c;针对游戏开发而作&#xff0c;写得很好。 以下是读书笔记&#xff0c;文末有原文链接 每个程序都有一定的软件架构&#xff0c;哪怕是全塞到main里也是一种架构好的架构可以把代码写成…...

Spring Bean的生命周期

文章目录 Spring Bean的生命周期加载Bean对象创建Bean对象构造对象填充属性初始化实例注册销毁 销毁 Spring Bean的生命周期 Spring Bean的生命周期就是指Bean对象从创建到销毁的过程&#xff0c;大体可以分为&#xff1a;实例化、属性赋值、初始化、使用、销毁。 加载Bean对象…...

基于量子同态的安全多方量子求和加密

摘要安全多方计算在经典密码学中一直扮演着重要的角色。量子同态加密(QHE)可以在不解密的情况下对加密数据进行计算。目前&#xff0c;大多数协议使用半诚实的第三方(TP)来保护参与者的秘密。我们使用量子同态加密方案代替TP来保护各方的隐私。在量子同态加密的基础上&#xff…...

Rust 宏系统的可组合设计

Rust宏系统的可组合设计&#xff1a;构建灵活代码的魔法工具箱 Rust的宏系统以其强大的元编程能力著称&#xff0c;而可组合设计则是其核心魅力之一。通过宏的组合与嵌套&#xff0c;开发者能够像搭积木一样构建复杂逻辑&#xff0c;同时保持代码的简洁性与可维护性。这种设计…...

【限时解禁|SITS2026未公开演讲PPT】:大模型量化压缩的“最后一公里”——如何让KV Cache压缩不掉F1、Attention稀疏不降BLEU?

第一章&#xff1a;SITS2026分享&#xff1a;大模型量化压缩技术 2026奇点智能技术大会(https://ml-summit.org) 大模型量化压缩已成为部署百亿参数级语言模型至边缘设备与推理服务集群的关键路径。在SITS2026现场&#xff0c;来自Meta、DeepMind及国内头部AI基础设施团队的工…...

Qwen3-0.6B-FP8对比实测:轻量级模型部署体验,vLLM+Chainlit方案真香

Qwen3-0.6B-FP8对比实测&#xff1a;轻量级模型部署体验&#xff0c;vLLMChainlit方案真香 1. 轻量级模型部署新选择 在AI应用快速落地的今天&#xff0c;如何在有限的计算资源上高效部署语言模型成为开发者面临的核心挑战。传统大模型动辄数十GB的显存需求让许多中小企业和个…...

借助爱毕业aibiye的智能算法,论文中的相似内容可被自动优化,结合学术标准调整,确保低重复率

嘿&#xff0c;大家好&#xff01;我是AI菌。今天咱们来聊聊一个让无数学生头疼的问题&#xff1a;论文重复率飙到30%以上怎么办&#xff1f;别慌&#xff0c;我这就分享5个实用降重技巧&#xff0c;帮你一次搞定&#xff0c;轻松压到合格线以下。这些方法都是我亲身试验过的&a…...

Nanbeige像素冒险聊天终端部署实战:5分钟拥有你的像素游戏AI助手

Nanbeige像素冒险聊天终端部署实战&#xff1a;5分钟拥有你的像素游戏AI助手 1. 引言&#xff1a;当AI对话遇上复古像素风 想象一下这样的场景&#xff1a;你打开一个聊天界面&#xff0c;映入眼帘的不是冷冰冰的现代极简设计&#xff0c;而是充满怀旧感的像素风格UI。湛蓝色…...

一天一个Python库:propcache - 简化属性缓存,提升性能翁

Qt是一个跨平台C图形界面开发库&#xff0c;利用Qt可以快速开发跨平台窗体应用程序&#xff0c;在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置&#xff0c;实现图形化开发极大的方便了开发效率&#xff0c;本笔记将重点介绍QSpinBox数值微调组件的常用方法及灵活应用。…...

从MCAS系统失效到监管失察:波音737MAX空难的工程伦理再审视

1. MCAS系统&#xff1a;一个被简化的技术补丁 当波音工程师面对737MAX机型发动机安装位置带来的气动特性变化时&#xff0c;他们选择了一个看似聪明的解决方案——机动特性增强系统&#xff08;MCAS&#xff09;。这个系统的设计初衷非常简单&#xff1a;当飞机仰角过大时&…...

Dreamweaver实战:从零构建响应式登录界面

1. 为什么选择Dreamweaver做响应式登录界面 作为一个从FrontPage时代就开始做网页的老鸟&#xff0c;我见证过无数网页编辑工具的兴衰。Dreamweaver能活到现在不是没有道理的——它完美平衡了可视化操作和代码控制的需求。特别是对于刚入门的前端开发者来说&#xff0c;用表格布…...

【紧急预警】传统音视频微服务架构将在2026Q3大规模失效——SITS2026原生处理标准已强制嵌入工信部信创目录

第一章&#xff1a;SITS2026分享&#xff1a;AI原生音视频处理 2026奇点智能技术大会(https://ml-summit.org) AI原生音视频处理正从“AI辅助”迈向“AI驱动”的范式跃迁——模型不再仅作为后处理模块嵌入传统管线&#xff0c;而是从采集、编码、传输到渲染的全链路深度重构。…...

兼容FX3U源码的大神级编程资料:增加以太网下载功能,支持MODBUS-TCP与定位指令集

18650锂电池高温热失控引言 在工业控制、汽车电子和分布式系统领域&#xff0c;CAN&#xff08;Controller Area Network&#xff09;总线因其高可靠性、实时性和抗干扰能力而成为首选通信协议。本文深入分析基于STM32F10x微控制器的CAN网络通信模块&#xff0c;重点解析其如何…...