Sirius
Sirius
Home avatar

Fan的博客

Golang sync.WaitGroup

sync.WaitGroup 是 Go 标准库 sync 包中一个非常常用的并发原语。它的主要作用是等待一组 Goroutine 全部执行完成。它非常适合于那种“主 Goroutine 派发多个子 Goroutine,并需要等待所有子 Goroutine 完成后再继续执行”的场景。

Golang sync.Mutex

sync.Mutex 是 Go 中最基础的互斥锁,用于保护共享资源,确保在同一时刻只有一个 Goroutine 可以访问该资源。它的实现非常精妙,并不仅仅是一个简单的锁,而是一个兼顾了性能和公平性的复杂同步原语。

Golang sync.Map

sync.Map 是 Go 语言标准库 sync 包中提供的一个并发安全的 map。它并非为了替代 map + sync.RWMutex 这种通用模式,而是针对**“读多写少”**的特定场景进行了深度优化。

sync.Map 的设计哲学是读写分离和空间换时间,其最终目的是:

Golang map

好的,我们来深入地讲解 Go 语言内置 map 的实现原理,并包含一个 Mermaid 结构图来帮助理解。

Go 的 map 是一个高度优化的哈希表实现。它在设计上兼顾了高性能的平均查找、插入、删除操作,并通过一个独特的渐进式扩容机制,避免了在扩容时产生长时间的程序暂停 (STW - Stop-The-World)。

Mermaid语法

Mermaid 是一种轻量级的、基于文本的图表绘制工具,它允许你使用类似 Markdown 的简洁语法来创建各种复杂的图表和可视化内容。由于其学习成本低、易于集成和版本控制的特性,Mermaid 在开发者社区和技术文档中广受欢迎。

Golang context 原理

  1. 取消传播 (Cancellation Propagation):

    • 这是 context 最核心和最常用的功能。当一个操作因为某种原因(例如,用户取消了请求、上游服务超时或出错、父操作不再需要结果)需要被终止时,可以使用 context 来通知所有相关的、为此操作派生出来的 Goroutine 停止它们的工作。
    • 这有助于避免不必要的资源消耗(如 CPU、内存、网络连接),并及时释放资源。例如,一个 HTTP 请求可能触发多个后台 Goroutine 去查询数据库、调用其他微服务等。如果客户端断开了连接,服务器应该能够取消这些后台任务。
  2. 超时控制 (Timeout/Deadline Management):

MySQL RR 中依然存在幻读的场景

MySQL 的 REPEATABLE READ (RR) 隔离级别通过临键锁 (Next-Key Lock) 机制,在很大程度上解决了幻读问题。不过在某些特定场景下,“幻读”现象依然会发生。