go 使用 sync.RWMutex

使用 sync.RWMutex

简介

简述读写锁的使用,以及注意点

使用

在读操作的时候 加读锁, 在写操作的时候加写锁,

举例:

多个协程需要读取、写入的操作

go 复制代码
// 读操作
func reader(id int) {
	for {
		rwMutex.RLock()
		fmt.Printf("Reader %d: Reading sharedData: %d\n", id, sharedData)
		time.Sleep(time.Millisecond * time.Duration(rand.Intn(500)))
		rwMutex.RUnlock()
	}
}

// 写操作
func writer(id int) {
	for {
		newData := rand.Intn(100)
		rwMutex.Lock()
		fmt.Printf("Writer %d: Writing sharedData: %d\n", id, newData)
		sharedData = newData
		time.Sleep(time.Millisecond * time.Duration(rand.Intn(1000)))
		rwMutex.Unlock()
	}
}

func main() {
	// 启动多个读者和写者
	for i := 0; i < 3; i++ {
		go reader(i)
		go writer(i)
	}
	...
}

注意点

1、是否选用

读写锁适用于读取操作远远多于写入操作的场景,在读取锁被多个协程持有, 可以提供并发性能。 但并不是所有场景都适合读写锁的, 写锁会阻塞其他读锁写锁的情况, 比如在写多读少的情况下就不适合读写锁, 会限制并发性能。
2、避免死锁的发生

使用读锁的时候, 不要套用写锁
3、注意锁的范围粒度

(看 sync.Mutex的使用注意点)
4、做好开发设计、慎重考虑写锁情况

因为写锁会阻塞其他写锁、读锁的情况, 在选择使用读写锁后, 要考虑写锁的场景,确保写锁占用时间短
5、考虑其他同步机制

读写锁有时候并不能完全消除竞态条件, 不要局限锁。 要考虑其他同步机制。

其他同步机制有:waitGroup、 条件变量、原子操作、通道... ...
源码解读

相关推荐
小小龙学IT2 小时前
Go 语言后端开发:从并发模型到生产落地的工程实践
开发语言·后端·golang
oqX0Cazj22 小时前
2026超火Go-Zero实战:从架构原理到高并发接口落地,彻底解决接口超时、雪崩问题
开发语言·架构·golang
go不是csgo8 小时前
从0到1理解Go熔断器:sony/gobreaker 源码剖析 + 仿TikTok Feed 项目实战
开发语言·后端·golang
oqX0Cazj29 小时前
Go-Zero数据库事务实战:本地事务+失败自动回滚+生产避坑+简单分布式事务方案
数据库·分布式·golang
右耳朵猫AI9 小时前
Go周刊2026W22 | GoReleaser 2.16、chi 5.3、tldx 1.4、wazero 1.12、Buf 1.70
开发语言·后端·golang
踏着七彩祥云的小丑9 小时前
Go学习第3天:变量+常量+运算符
开发语言·学习·golang·go
晨曦中的暮雨21 小时前
Golang速通(Javaer版)
java·开发语言·后端·golang
codeejun1 天前
每日一Go-76(架构篇)|多集群部署 / 容灾 / Failover / Backup / 热迁移
开发语言·架构·golang
迷茫运维路1 天前
golang_Viper配置管理器
后端·golang
geovindu1 天前
go: Broadcast Pattern
开发语言·后端·设计模式·golang·广播模式