sync.RWMutex (读写锁) 和 sync.Mutex (互斥锁)的区别

sync.RWMutex (读写锁) 和 sync.Mutex (互斥锁) 的主要区别在于它们的锁定机制:

  1. sync.Mutex (互斥锁):
var mutex sync.Mutex

// 加锁
mutex.Lock()
// 解锁
mutex.Unlock()
  • 同一时间只允许一个 goroutine 访问共享资源
  • 不管是读操作还是写操作,都会完全锁定
  • 其他 goroutine 必须等待锁释放才能访问
  • 适用于读写频率接近的场景
  1. 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
}

使用建议:

  1. 如果你的场景是读多写少,使用 RWMutex 会有更好的性能
  2. 如果读写操作比例接近,使用 Mutex 就足够了
  3. 如果写操作比读操作多,使用 Mutex 可能更合适,因为 RWMutex 会有额外的开销

需要注意的是,RWMutex 虽然允许并发读,但会在写操作时带来额外的开销(需要等待所有读操作完成)。在某些场景下,这个开销可能会抵消并发读取带来的性能优势。

posted @   仁义礼智信的  阅读(7)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 推荐几款开源且免费的 .NET MAUI 组件库
· 实操Deepseek接入个人知识库
· 易语言 —— 开山篇
· Trae初体验
历史上的今天:
2023-02-08 mysql-视图
点击右上角即可分享
微信分享提示