golang Mutex锁和RWMutex锁

本文深入探讨了Golang中sync包的两种锁机制:Mutex(互斥锁)和RWMutex(读写锁)。Mutex用于确保同一时刻只有一个goroutine访问共享资源,而RWMutex允许多个读操作同时进行,但阻止写操作直到所有读锁被释放。通过代码示例展示了如何在实际应用中正确使用这两种锁。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

golang 中的 sync 包实现了两种锁:

  • Mutex:互斥锁
  • RWMutex:读写锁,RWMutex 基于 Mutex 实现
Mutex(互斥锁)

1、Mutex 为互斥锁,Lock() 加锁,Unlock() 解锁

2、在一个 goroutine 获得 Mutex 后,其他 goroutine 只能等到这个 goroutine 释放该 Mutex

3、使用 Lock() 加锁后,不能再继续对其加锁,直到 Unlock() 解锁后才能再加锁

4、在 Lock() 之前使用 Unlock() 会导致 panic 异常

5、已经锁定的 Mutex 并不与特定的 goroutine 相关联,这样可以利用一个 goroutine 对其加锁,再利用其他 goroutine 对其解锁

6、在同一个 goroutine 中的 Mutex 解锁之前再次进行加锁,会导致死锁
适用于读写不确定,并且只有一个读或者写的场景

RWMutex(读写锁)

1、RWMutex 是单写多读锁,该锁可以加多个读锁或者一个写锁

2、读锁占用的情况下会阻止写,不会阻止读,多个 goroutine 可以同时获取读锁

3、写锁会阻止其他 goroutine(无论读和写)进来,整个锁由该 goroutine 独占
适用于读多写少的场景

代码示例
import  "sync"

// 将锁放入结构体,定义的实例可以直接使用Lock和Unlock
type map struct {
    nameMap map[string]string `json:"nameMap"`
    sync.RWMutex
}

var name *map
name.Lock()
nameMap["amber"] = "小白"
name.Unlock()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值