go 互斥锁与读写锁

 

 

go 互斥锁与读写锁

互斥锁

互斥锁控制下的多个写操作之间、多个读操作之间是互斥的,并且写操作与读操作之间也是互斥的。
互斥锁适用于读写不确定场景,即读写次数没有明显的区别,并且只允许只有一个读或者写的场景,所以该锁叶叫做全局锁,也就是完全互斥。
互斥锁是传统的并发程序对共享资源进行访问控制的主要手段。它由标准库代码包sync中的Mutex结构体类型代表。sync.Mutex类型(确切地说,是*sync.Mutex类型)只有两个公开方法――Lock和Unlock。顾名思义,前者被用于锁定当前的互斥量,而后者则被用来对当前的互斥量进行解锁。

使用方法

1
2
3
4
5
6
7
var mutex sync.Mutex
 
func write() {
mutex.Lock() //加互斥锁
defer mutex.Unlock() //解互斥锁
// 省略若干条语句
}

使用建议

  • 互斥锁的成对的锁定和解锁应该成对出现(虽然互斥锁可以被直接的在多个Goroutine之间共享)。
  • 把互斥锁作为某一个结构体类型中的字段,以便在该类型的多个方法中使用它。
  • 我们还应该使代表互斥锁的变量的访问权限尽量的低。这样才能尽量避免它在不相关的流程中被误用,从而导致程序不正确的行为。
  • 习惯使用defer,defer语句保证了在该函数被执行结束之前互斥锁mutex一定会被解锁。


读写锁

读写锁即是针对于读写操作的互斥锁。它与普通的互斥锁最大的不同就是,它可以分别针对读操作和写操作进行锁定和解锁操作。
也就是说,读写锁控制下的多个写操作之间都是互斥的,并且写操作与读操作之间也都是互斥的。但是,多个读操作之间却不存在互斥关系。

使用方法

1
2
3
4
5
6
7
var mutex sync.RWMutex
 
func write() {
mutex.RLock() //加读写锁
defer mutex.RUnlock() //解读写锁
// 省略若干条语句
}
posted @   -零  阅读(862)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
历史上的今天:
2019-02-22 Django之Models(一)
点击右上角即可分享
微信分享提示