sync.RWMutex (读写锁) 和 sync.Mutex (互斥锁)的区别
sync.RWMutex (读写锁) 和 sync.Mutex (互斥锁) 的主要区别在于它们的锁定机制:
- sync.Mutex (互斥锁):
var mutex sync.Mutex
// 加锁
mutex.Lock()
// 解锁
mutex.Unlock()
- 同一时间只允许一个 goroutine 访问共享资源
- 不管是读操作还是写操作,都会完全锁定
- 其他 goroutine 必须等待锁释放才能访问
- 适用于读写频率接近的场景
- sync.RWMutex (读写锁):
var rwMutex sync.RWMutex
// 写锁
rwMutex.Lock()
rwMutex.Unlock()
// 读锁
rwMutex.RLock()
rwMutex.RUnlock()
- 支持多个读操作并发执行
- 写操作时会阻塞所有其他读写操作
- 读操作时只会阻塞写操作,不会阻塞其他读操作
- 适用于读多写少的场景
这里有个简单的对比示例:
// 使用 Mutex
type Counter struct {
sync.Mutex
count int
}
func (c *Counter) Increment() {
c.Lock()
c.count++
c.Unlock()
}
func (c *Counter) GetCount() int {
c.Lock()
defer c.Unlock()
return c.count
}
// 使用 RWMutex
type RWCounter struct {
sync.RWMutex
count int
}
func (c *RWCounter) Increment() {
c.Lock()
c.count++
c.Unlock()
}
func (c *RWCounter) GetCount() int {
c.RLock()
defer c.RUnlock()
return c.count
}
使用建议:
- 如果你的场景是读多写少,使用 RWMutex 会有更好的性能
- 如果读写操作比例接近,使用 Mutex 就足够了
- 如果写操作比读操作多,使用 Mutex 可能更合适,因为 RWMutex 会有额外的开销
需要注意的是,RWMutex 虽然允许并发读,但会在写操作时带来额外的开销(需要等待所有读操作完成)。在某些场景下,这个开销可能会抵消并发读取带来的性能优势。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 推荐几款开源且免费的 .NET MAUI 组件库
· 实操Deepseek接入个人知识库
· 易语言 —— 开山篇
· Trae初体验
2023-02-08 mysql-视图