sync.Mutex
sync.RWMutex
type RWMutex struct {
w Mutex // 互斥锁
writerSem uint32 // 写锁信号量
readerSem uint32 // 读锁信号量
readerCount int32 // 读锁计数器
readerWait int32 // 获取写锁时需要等待的读锁释放数量
}
const rwmutexMaxReaders = 1 << 30 //支持最多2^30个读
读锁加锁
- 判断readcount,小于0,说明有写锁,阻塞,
- 否则readcount +1
读锁解锁
- 减少读操作计数,即readerCount–
- 唤醒等待写操作的协程(如果有的话)
写锁
复用 mutex
sync.Once
mutex
sync.Map
type Map struct {
mu Mutex // 互斥锁,用以处理并发读写的问题
read atomic.Value // 包含可以并发访问的map部分,可以直接Load,但Store必须先持有mu
dirty map[interface{}]*entry //包含需要持有mu才能访问的部分,为确保dirty快速升级为read,dirty中还包含read中未删除的部分
misses int //记录从dirty表查询的次数。misses大到超过dirty拷贝的消耗时,会直接将dirty提升至read,后续的store操作会生成新的dirty。
}
Store(put)
Load方法(查询)
Delete方法
sync/atomic
cas 内存 硬件锁内存