Go sync 包
sync 包提供 WaitGroup、Mutex、RWMutex、Once 等基础同步原语,用于在共享状态场景里建立安全协作。
#type / concept
#status / growing
#tech / dev
#resource / go
[!info] related notes
- 所属 MOC: Go 并发 MOC
- 前置概念: Go goroutine, Go channel
- 相关诊断: Go race detector
Go sync 包
一句话定义
sync 包是 Go 标准库提供的一组基础同步原语,用来在共享内存场景下协调 goroutine 之间的执行顺序和数据访问。
核心机制 / 工作原理
sync 里最常见的能力包括:
WaitGroup:等待一组 goroutine 完成Mutex:独占锁RWMutex:读写锁Once:保证某段初始化逻辑只执行一次
这类原语通常出现在:
- 多 goroutine 共享状态
- 无法只靠 channel 把数据流画干净
- 需要非常直接地表达“先做完再继续”或“这里必须加锁”
最小例子 / 最小场景
var wg sync.WaitGroup
wg.Add(1)
go func() {
defer wg.Done()
fmt.Println("work")
}()
wg.Wait()
这个例子体现的是:
- goroutine 启动很容易
- 但调用方是否需要等待它完成,是另一件必须显式表达的事
边界与易混淆点
sync不是并发的默认入口,它更像“共享状态场景下的底层工具箱”- 锁能解决安全问题,不等于能自动解决结构混乱问题
WaitGroup负责等待,不负责错误传播和取消控制