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()