Go 语言中 sync.RWMutex 实现读写锁,允许多读并发、写独占,适用于读多写少场景;需正确配对 RLock/RUnlock 和 Lock/Unlock,避免混用、嵌套或读锁内耗时操作。
Go 语言中通过 sync.RWMutex 实现读写锁,让多个读操作可以并行执行,而写操作独占资源,从而显著提升高读低写的并发场景效率。
读写锁不是“升级”或“降级”互斥锁,而是将访问分为两类:读操作(共享) 和 写操作(独占)。只要没有写操作进行,任意数量的 goroutine 可以同时读;一旦有写操作开始,所有新读、新写都必须等待;
写操作完成前,不允许其他任何读或写进入。
注意:sync.RWMutex 不保证公平性,可能造成写饥饿(大量读持续到来时,写一直被阻塞),如需公平控制,需额外加队列或使用第三方库(如 github.com/cespare/xxhash 配合自定义调度)。
读操作使用 RLock() 和 RUnlock(),写操作使用 Lock() 和 Unlock()。二者不可混用,且必须成对出现,否则会导致 panic 或死锁。
切勿在持有 RLock 期间调用 Lock,这会死锁;也不要在 Lock 持有时再 RLock——RWMutex 不支持递归或嵌套。
适合读多写少、数据结构生命周期长、读操作耗时短的场景,例如配置缓存、路由表、状态快照等。
sync/atomic
sync.Map 或封装为只读快照 + 写时重建以下是一个带读写锁的线程安全配置结构:
type Config struct {若配置更新频率极低,还可进一步优化:写时生成新 map,读时原子替换指针(配合 atomic.Value),彻底消除读锁开销。