Go 语言 sync 包解析
Go 语言的 sync
包是并发编程的核心工具集,提供了一系列同步原语,用于协调多个 goroutine 之间的操作,确保并发安全。它的设计围绕 Go 语言的 CSP(通信顺序进程)模型展开,同时也支持传统的共享内存同步方式。
一、核心同步原语
1. Mutex(互斥锁)
sync.Mutex
是最基础的互斥锁,保证同一时间只有一个 goroutine 能访问共享资源。
-
核心方法:
Lock()
:获取锁,若已被占用则阻塞等待。Unlock()
:释放锁,必须与Lock()
成对使用。
-
使用场景:保护临界区资源,如共享变量的读写。
var mu sync.Mutex var count intfunc increment() {mu.Lock()defer mu.Unlock()count++ // 临界区操作 }
-
注意事项:
- 不可重入:同一 goroutine 再次调用
Lock()
会导致死锁。 - 需确保
Unlock()
被执行(通常用defer
)。
- 不可重入:同一 goroutine 再次调用
2. RWMutex(读写锁)
sync.RWMutex
是读写分离的锁,允许多个读操作并发,但写操作需独占。
-
核心方法:
- 读锁:
RLock()
获取,RUnlock()
释放(可被多个 goroutine 同时持有)。 - 写锁:
Lock()
获取,Unlock()
释放(独占)。
- 读锁:
-
适用场景:读多写少的场景(如缓存读取),提高并发效率。
var rwmu sync.RWMutex var data map[string]intfunc readKey(key string) int {rwmu.RLock()defer rwmu.RUnlock()return data[key] }func writeKey(key string, val int) {rwmu.Lock()defer rwmu.Unlock()data[key] = val }
3. WaitGroup
sync.WaitGrou