谈谈自己对GO的RWMutex的理解

本文探讨了Go中的RWMutex,它基于Mutex并支持并发读操作,适合读多写少的场景。文章详细阐述了RWMutex的读锁和写锁的获取与释放流程,包括读锁增加和减少、写锁的获取与释放以及如何处理读者和写者的同步问题。通过对RWMutex的深入理解,有助于更好地掌握Go的并发控制。

RWMutex核心还是基于Mutex的,如果想了解Mutex的话可以看一下我上一篇写的Mutex的文章

RWMutex的特性就是支持并发读。适用于读多写少的场景。

RWMutex的定义

type RWMutex struct {
	w           Mutex  // 互斥锁
	writerSem   uint32 // 写锁用的信号量
	readerSem   uint32 // 读锁用的信号量
	readerCount int32  // 当前正在执行读操作的goroutine数量
	readerWait  int32  // 获取写锁时,当前还持有读锁的goroutine数量
}

const rwmutexMaxReaders = 1 << 30

RWMutex.Lock()

func (rw *RWMutex) Lock() {
	// 首先调用Mutex的Lock方法获取到锁
	rw.w.Lock()
	
	// 把readerCount改成负数,这样后续的读操作就会被阻塞
	// r 就是当前正在执行读操作的goroutine数量 
	r := atomic.AddInt32(&rw.readerCount, -rwmutexMaxReaders) + rwmutexMaxReaders
	
	// 如果当前有正在执行读操作的goroutine
	// 把r赋值给readerWait
	if r != 0 && atomic.AddInt32(&rw.readerWait, r) != 0 {
	
		// 获取写锁的goroutine进入休眠,等待被唤醒
		runtime_SemacquireMutex(&rw.writerSem, false, 0)
	}
}

RWMutex.Unlock()<

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值