sync 包选型:Mutex、RWMutex 与 Once
并发安全不一定要 channel。共享状态上的锁,用对仍然清晰且高效。
sync 包提供互斥与协作原语。选型依据是访问模式,而不是「锁看起来不优雅」。
Mutex vs RWMutex
- 读多写少:RWMutex 可能更好;读写临界区都要短。
- 写很频繁:RWMutex 的读者写者协调未必赢过 Mutex。
- 先量再换:无证据前,Mutex 往往足够。
Once
sync.Once 适合进程级单次初始化。f 只执行一次;若 f panic,后续调用会认为已执行——初始化务必可靠或自行恢复。
var once sync.Once
var client *Client
func ClientInstance() *Client {
once.Do(func() { client = newClient() })
return client
}
注意
不要复制已使用的 Mutex;结构体传锁用指针。避免在持锁时做慢 IO,防止放大抖动。
小结
共享内存用锁保护,跨职责协作用 channel。Once 管初始化,Mutex 管互斥——边界清楚,代码就少惊悚。