Rust Lazy浅析 代码staticDATA_MANAGER:LazyMutexDataManagerLazy::new(||Mutex::new(DataManager::new()));这行代码实现了一个线程安全的全局单例模式拆解如下static DATA_MANAGER— 全局静态变量在整个程序运行期间只有一份DATA_MANAGER所有代码共享同一个实例。LazyT— 惰性初始化懒加载once_cell::sync::Lazy保证初始化闭包|| Mutex::new(DataManager::new())只会在第一次被访问时执行一次之后每次访问都返回已经初始化好的值。不是程序启动时就创建而是用到时才创建只创建一次线程安全后续访问直接复用MutexDataManager— 互斥锁Mutex互斥锁保证多线程环境下对DataManager的访问是互斥的——同一时刻只有一个线程能持有锁并操作数据避免数据竞争data race。DataManager::new()— 实际数据真正的数据管理器实例持有movie_map、user_map、genre_reverse_index三张核心哈希表。详细例子假设有一个电影推荐系统 Web 服务同时有 3 个用户请求进来分别由 3 个线程处理时间线 → 线程A查电影1 ──── 等锁 ──┬── 拿到锁 → 查movie_map → 释放锁 线程B查用户5 ──── 等锁 ──┤ ├── 拿到锁 → 查user_map → 释放锁 线程C查类型 ──── 等锁 ──┘ └── 拿到锁 → 查genre_index → 释放锁 首次访问以init_data_manager为例pubfninit_data_manager(base_path:str){letmutdmDATA_MANAGER.lock().unwrap();// ① 第一次访问触发 Lazy 初始化// ② Lazy 执行闭包Mutex::new(DataManager::new())创建空的 movie_map、user_map、genre_reverse_index// ③ lock() 获取锁拿到可变引用 mut DataManagerdm.load_data(movie_path,link_path,rating_path,...);// ④ 加载所有CSV数据}// ⑤ dm 离开作用域自动释放锁// 之后任何线程再访问 DATA_MANAGER.lock()Lazy 不会再初始化直接返回已有的 Mutex运行时查询多线程并发场景// 线程1查询某部电影fnhandle_get_movie(movie_id:i32){letdmDATA_MANAGER.lock().unwrap();// 获取锁letmoviedm.get_movie_by_id(movie_id);// 查询println!({:?},movie);}// 锁自动释放// 线程2按类型查询电影同时进行但需要排队等锁fnhandle_get_by_genre(genre:str){letdmDATA_MANAGER.lock().unwrap();// 等线程1释放锁后才能获取letmoviesdm.get_movies_by_genre(genre,10,rating);println!({:?},movies);}这个模式解决了什么问题问题解决方案数据只加载一次避免重复读取CSV文件Lazy保证只初始化一次多线程同时访问同一份数据Mutex保证互斥访问全局可访问不需要到处传参static全局变量 get_data_manager()不使用时零开销Lazy在首次访问前不占用资源简单类比就像整个程序有一本共享的百科全书电影、用户、评分数据所有线程都能查阅但同一时刻只允许一个人翻书而且这本书只在第一次有人要看时才从仓库搬出来。

相关新闻

最新新闻

SerenityOS 命令行选项解析指南:getopt 与 getopt_long 用法、返回值与底层实现

SerenityOS 命令行选项解析指南:getopt 与 getopt_long 用法、返回值与底层实现

SerenityOS 命令行选项解析指南:getopt 与 getopt_long 用法、返回值与底层实现 【免费下载链接】serenity The Serenity Operating System 🐞 项目地址: https://gitcode.com/GitHub_Trending/se/serenity 导读 本文以 getopt(3) 手册 为核心&a…

2026/9/26 23:24:47
轻量服务器还是ECS?大促云服务器选购与避坑实战指南

轻量服务器还是ECS?大促云服务器选购与避坑实战指南

每年大促节点,群里永远有人在问同一个问题:“38元的轻量服务器到底怎么抢?为什么我每次点进去都是已售罄?68元直购和99元的ECS我到底选哪个?”作为一个常年帮团队和自己采购云服务器的老用户,我太清楚这种纠…

2026/9/27 19:13:42
为 AI 代理的 Review 动作编写 Cedar 审批门控策略:review-agent-governance 策略编写实战指南

为 AI 代理的 Review 动作编写 Cedar 审批门控策略:review-agent-governance 策略编写实战指南

为 AI 代理的 Review 动作编写 Cedar 审批门控策略:review-agent-governance 策略编写实战指南 【免费下载链接】agents Multi-harness agentic plugin marketplace for Claude Code, Codex, Cursor, OpenCode, GitHub Copilot, and Google Antigravity 项目地址:…

2026/9/27 15:27:56
PaddleOCR 手写数学公式识别算法 CAN 实战指南:Counting-Aware Network 训练、评估与推理部署

PaddleOCR 手写数学公式识别算法 CAN 实战指南:Counting-Aware Network 训练、评估与推理部署

PaddleOCR 手写数学公式识别算法 CAN 实战指南:Counting-Aware Network 训练、评估与推理部署 【免费下载链接】PaddleOCR Turn any PDF or image document into structured data for your AI. A powerful, lightweight OCR toolkit that bridges the gap between i…

2026/9/27 19:54:03
Spring源码解析:构造器注入的类型转换与候选匹配机制

Spring源码解析:构造器注入的类型转换与候选匹配机制

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/27 9:16:41
openai-agents-python 多模型接入指南:深入解析 AnyLLMModel 适配层与 any-llm 路由

openai-agents-python 多模型接入指南:深入解析 AnyLLMModel 适配层与 any-llm 路由

openai-agents-python 多模型接入指南:深入解析 AnyLLMModel 适配层与 any-llm 路由 【免费下载链接】openai-agents-python A lightweight, powerful framework for multi-agent workflows 项目地址: https://gitcode.com/GitHub_Trending/op/openai-agents-pyth…

2026/9/26 21:11:24

日新闻

周新闻