0

0

Golang sync同步原语 Mutex/RWMutex使用

P粉602998670

P粉602998670

发布时间:2025-08-28 14:29:01

|

884人浏览过

|

来源于php中文网

原创

Go的sync包提供Mutex和RWMutex用于并发安全;2. Mutex通过Lock/Unlock确保临界区互斥访问,需defer Unlock防死锁;3. RWMutex在读多写少场景提升性能,允许多个读但写时独占;4. 使用建议包括选合适锁类型、避免持锁耗时操作、注意锁粒度与嵌入问题。

golang sync同步原语 mutex/rwmutex使用

在Go语言中,sync包提供了多种同步原语,用于协调多个goroutine对共享资源的访问。其中最常用的是 MutexRWMutex,它们能有效防止数据竞争,保证并发安全。

Mutex:互斥锁

Mutex(Mutual Exclusion)是最基本的同步机制,用于确保同一时间只有一个goroutine能访问临界区。

使用方法非常简单:

  • 通过 sync.Mutex{} 声明一个互斥锁
  • 在访问共享资源前调用 Lock()
  • 操作完成后必须调用 Unlock()

典型用法如下:

立即学习go语言免费学习笔记(深入)”;

var mu sync.Mutex
var counter int

func increment() {
mu.Lock()
defer mu.Unlock()
counter++
}

注意:务必使用 defer mu.Unlock() 来确保锁一定会被释放,避免死锁。

RWMutex:读写锁

当共享资源的读操作远多于写操作时,RWMutex 能提供更高的并发性能。

陌言AI
陌言AI

陌言AI是一个一站式AI创作平台,支持在线AI写作,AI对话,AI绘画等功能

下载

它支持两种锁:

  • RLock()/RUnlock():读锁,允许多个读操作同时进行
  • Lock()/Unlock():写锁,独占访问,写期间不允许读或写

规则如下:

  • 多个goroutine可同时持有读锁
  • 写锁是独占的,获取写锁时必须等待所有读锁释放
  • 读操作不能升级为写操作,否则会死锁

示例:

var rwmu sync.RWMutex
var config map[string]string

func readConfig(key string) string {
rwmu.RLock()
defer rwmu.RUnlock()
return config[key]
}

func updateConfig(key, value string) {
rwmu.Lock()
defer rwmu.Unlock()
config[key] = value
}

这个例子中,多个goroutine可以并发读取配置,但更新配置时会阻塞所有读和写操作。

使用建议与注意事项

实际开发中,合理选择锁类型很重要。

  • 如果读多写少,优先使用 RWMutex 提升性能
  • 避免在持有锁期间做耗时操作(如网络请求、长时间计算)
  • 不要重复加锁,Mutex不是可重入锁
  • 注意锁的粒度,过粗影响并发,过细增加复杂度
  • 结构体中嵌入Mutex时,注意不要因值拷贝导致锁失效

基本上就这些。Mutex和RWMutex是Go并发编程的基石,掌握它们的正确用法,能有效避免数据竞争,写出安全高效的并发代码。

相关专题

更多
golang如何定义变量
golang如何定义变量

golang定义变量的方法:1、声明变量并赋予初始值“var age int =值”;2、声明变量但不赋初始值“var age int”;3、使用短变量声明“age :=值”等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

180

2024.02.23

golang有哪些数据转换方法
golang有哪些数据转换方法

golang数据转换方法:1、类型转换操作符;2、类型断言;3、字符串和数字之间的转换;4、JSON序列化和反序列化;5、使用标准库进行数据转换;6、使用第三方库进行数据转换;7、自定义数据转换函数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

228

2024.02.23

golang常用库有哪些
golang常用库有哪些

golang常用库有:1、标准库;2、字符串处理库;3、网络库;4、加密库;5、压缩库;6、xml和json解析库;7、日期和时间库;8、数据库操作库;9、文件操作库;10、图像处理库。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

340

2024.02.23

golang和python的区别是什么
golang和python的区别是什么

golang和python的区别是:1、golang是一种编译型语言,而python是一种解释型语言;2、golang天生支持并发编程,而python对并发与并行的支持相对较弱等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

209

2024.03.05

golang是免费的吗
golang是免费的吗

golang是免费的。golang是google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的开源编程语言,采用bsd开源协议。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

393

2024.05.21

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

197

2025.06.09

golang相关判断方法
golang相关判断方法

本专题整合了golang相关判断方法,想了解更详细的相关内容,请阅读下面的文章。

191

2025.06.10

golang数组使用方法
golang数组使用方法

本专题整合了golang数组用法,想了解更多的相关内容,请阅读专题下面的文章。

233

2025.06.17

AO3中文版入口地址大全
AO3中文版入口地址大全

本专题整合了AO3中文版入口地址大全,阅读专题下面的的文章了解更多详细内容。

1

2026.01.21

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
golang socket 编程
golang socket 编程

共2课时 | 0.1万人学习

nginx浅谈
nginx浅谈

共15课时 | 0.8万人学习

golang和swoole核心底层分析
golang和swoole核心底层分析

共3课时 | 0.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号