Go 并发原语 - Once
前面几篇我们聊了 Mutex、WaitGroup 和 Cond,它们各自解决不同维度的并发问题。这一篇聊一个相对简单但极其实用的原语——sync.Once,它解决的是 “确保某个操作只执行一次” 的问题,最经典的场景就是单例资源的延迟初始化。 一、为什么需要 Once? 单例资源的初始化有好几种方式,按执行时机可以分成两类: 🚀程序启动时初始化package 级别变 …
- #Golang
- #并发编程
- #Once
技术文章、项目实践和个人思考。
前面几篇我们聊了 Mutex、WaitGroup 和 Cond,它们各自解决不同维度的并发问题。这一篇聊一个相对简单但极其实用的原语——sync.Once,它解决的是 “确保某个操作只执行一次” 的问题,最经典的场景就是单例资源的延迟初始化。 一、为什么需要 Once? 单例资源的初始化有好几种方式,按执行时机可以分成两类: 🚀程序启动时初始化package 级别变 …
前两篇我们聊了 Mutex 和 WaitGroup,它们分别解决"互斥访问"和"等待一组任务完成"的问题。但并发编程中还有一类需求——等待某个条件满足后再继续执行。比如:队列满了,生产者要等;队列空了,消费者要等。这就是 sync.Cond(条件变量)要解决的问题。 一、为什么需要 Cond? 假设你要实现一个限定容量的队列:队列满时生产者阻塞,队列空时消费 …
上一篇我们聊了 Mutex,它解决的是"同一时刻只能有一个 goroutine 访问共享资源"的问题。但并发编程中还有另一类常见需求——等待一组任务全部完成后再继续。这就是 sync.WaitGroup 要解决的问题。 一、为什么需要 WaitGroup? 假设你要并行执行三个子任务,全部完成后才能进入下一步。没有 WaitGroup 的话,你可能会这样写: Copy // ❌ …
并发编程是 Go 的灵魂,而 Mutex(互斥锁) 是并发控制的第一道防线。这篇文章带你从"为什么需要锁"开始,一路走到 Mutex 的演进原理、常见坑点和读写锁 RWMutex,争取一文把 Mutex 讲透。 一、没有锁的世界有多危险? 先看一个经典的并发计数器问题: Copy package main import ( "fmt" …
这篇文章整合了我在游戏服务器开发过程中积累的几个核心主题的实践经验,时间跨度从 2018 到 2022 年。内容涵盖 3D 寻路、唯一 ID 生成、Go Plugin 热更新、通信安全加密,以及 Go 性能优化技巧。 一、3D 寻路:RecastNavigation 在游戏服务器中的应用 最初发表于 2018 年,记录了将 RecastNavigation 应用于游戏服务器的完整过程。 …
从 WordPress 迁移到 Hugo 的过程中,翻到了旧站上的「记事本」页面——一个从 2017 年就开始积攒的链接收藏夹。这些链接记录了我在不同阶段关注的技术方向,与其让它们躺在旧站里吃灰,不如整理出来,也算是一份个人技术成长的缩影。 注意:部分链接年代久远,可能已经失效。 博客推荐 鸟窝博客 — Go 语言领域非常活跃的中文博主 云风的博客 — 游戏开发圈的前辈,写了二十多年博客 Go 语 …
为什么要告别 WordPress? WordPress 是一个优秀的内容管理系统,但对于一个想要通过 AI 工具(如 Claude Code)来管理内容的开发者来说,它有几个痛点: 内容存储在数据库中,AI 工具无法直接读写 PHP + MySQL 的技术栈维护成本高 安全更新需要频繁关注 动态渲染相比静态站点速度慢 新方案:Hugo + Adritian 最终选择了 Hugo 作为静态站点生成 …
为什么选择 Go? Go 语言在后端开发中的优势不言而喻: 编译速度快:秒级编译,开发体验流畅 并发原语优秀:goroutine + channel 模型简洁强大 部署简单:单二进制文件,无依赖 性能优异:接近 C 的性能,远超脚本语言 项目结构推荐 Copy project/ ├── cmd/ # 应用入口 │ └── server/ │ └── main.go ├── internal/ # …
分布式系统的核心挑战 分布式系统面临的根本挑战可以用 CAP 定理来概括——一致性(Consistency)、可用性(Availability)、分区容错性(Partition Tolerance)三者不可兼得。 在实际工程中,我们几乎总是需要保证分区容错性,因此核心的权衡在于: CP 系统:优先一致性,如 ZooKeeper、etcd AP 系统:优先可用性, …