golang 读写锁原理

读写锁 RWMutex

1、概念

  • 读写锁和互斥锁都是为了防止并发而加的锁
  • 读写锁相比互斥锁,就是增加了对读写的控制
  • 读写锁 写写之间是互斥的,读写也是互斥的,但是读锁 是可以添加多个的

2、RWMutex 代码

type RWMutex struct {
   
	w           Mutex  // held if there are pending writers
	writerSem   uint32 // semaphore for writers to wait for completing readers
	readerSem   uint32 // semaphore for readers to wait for completing writers
	readerCount int32  // number of pending readers
	readerWait  int32  // number of departing readers
}
  • w : 互斥锁,写 协程获得该锁后,其他协程处于等待
  • writerSem :writer 等待 读完成排队的信号量
  • readerSem : read 等待 write 完成排队的信号量
  • readerCount : 读锁的计数器
  • readerWait : 等待读锁释放的数量

3、常量定义

const rwmutexMaxReaders = 1 << 30
  • go支持的最高加读锁的数量 4294967296,go中对读锁的数量采用负值计算,逐渐递减

4、接口定义

  • RLock():读锁定
  • RUnlock():解除读锁定
  • Lock(): 写锁定,与Mutex完全一致
  • Unlock():解除写锁定,与Mutex完全一致

5、读锁

5.1 读加锁

RLock 代码
// RLock locks rw for reading.
//
// It should not be used for recursive read locking; a blocked Lock
// call excludes new readers from acquiring the lock. See the
// documentation on the RWMutex type.
func (rw *RWMutex) RLock() {
   
// 竞争检测
	if race.Enabled {
   
		_ = rw.w.state
		race.Disable()
	}
	// readerCount 加一
	// 如果小于0,说明目前是写锁定,进入阻塞
	if atomic.AddInt32(&rw.readerCount, 1) < 0 {
   
		// A writer is pending, wait for it.
		// 等待写锁释放
		runtime_SemacquireMutex(&rw.readerSem, false, 0)
	}
	// 是否开启静态检测
	if race.Enabled {
   
		race.Enable()
		race.Acquire
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值