Go 并发编程中的互斥执行

go 并发编程中的互斥执行

在 Go 语言的并发编程中,控制对共享资源的访问是至关重要的。为了保证数据的一致性和程序的正确性,我们需要确保在同一时刻只有一个 goroutine 可以访问特定的代码段,这个代码段通常被称为临界区。虽然 Go 提供了强大的并发原语,例如 channels,但在某些情况下,使用互斥锁(mutex)仍然是解决并发问题的有效手段。

使用 sync.Mutex 实现互斥

sync.Mutex 是 Go 语言标准库 sync 包中提供的互斥锁。它提供了 Lock() 和 Unlock() 两个方法,分别用于获取锁和释放锁。当一个 goroutine 调用 Lock() 方法时,如果锁当前未被其他 goroutine 持有,则该 goroutine 成功获取锁并继续执行;否则,该 goroutine 将阻塞,直到锁被释放。当 goroutine 完成对临界区的访问后,必须调用 Unlock() 方法释放锁,以便其他 goroutine 可以获取锁。

以下是一个使用 sync.Mutex 的示例:

package mainimport (    "fmt"    "sync"    "time")var (    mutex   sync.Mutex    counter int)func incrementCounter(id int, wg *sync.WaitGroup) {    defer wg.Done()    for i := 0; i < 1000; i++ {        mutex.Lock() // 获取锁        counter++        fmt.Printf("Goroutine %d: Counter = %dn", id, counter) // 临界区        mutex.Unlock() // 释放锁        time.Sleep(time.Millisecond) // 模拟一些工作    }}func main() {    var wg sync.WaitGroup    wg.Add(2)    go incrementCounter(1, &wg)    go incrementCounter(2, &wg)    wg.Wait()    fmt.Println("Final Counter Value:", counter)}

在这个例子中,incrementCounter 函数模拟了一个需要访问共享变量 counter 的 goroutine。为了防止多个 goroutine 同时修改 counter 导致数据竞争,我们使用 mutex.Lock() 和 mutex.Unlock() 包裹了对 counter 的访问。这样,在任何时刻,只有一个 goroutine 能够修改 counter 的值。

最佳实践:优先使用 Go Channels

虽然 sync.Mutex 可以有效地保护临界区,但在 Go 语言中,通常推荐使用 Go channels 来实现并发控制。Channels 提供了一种更加安全和简洁的方式来传递数据和同步 goroutine,可以有效地避免数据竞争和死锁等问题。

以下是一个使用 channels 实现相同功能的示例:

package mainimport (    "fmt"    "sync")func main() {    counter := 0    iterations := 1000    numGoroutines := 2    increment := make(chan int, numGoroutines*iterations) // Buffered channel    var wg sync.WaitGroup    wg.Add(numGoroutines)    // Launch goroutines to increment the counter    for i := 0; i < numGoroutines; i++ {        go func(id int) {            defer wg.Done()            for j := 0; j < iterations; j++ {                increment <- 1 // Send a signal to increment                fmt.Printf("Goroutine %d: increment signal sentn", id)            }        }(i + 1)    }    // Launch a goroutine to sum up the increments    go func() {        for i := 0; i < numGoroutines*iterations; i++ {            counter += <-increment // Receive an increment signal            fmt.Printf("Sum: Counter = %dn", counter)        }    }()    wg.Wait()    fmt.Println("Final Counter Value:", counter)}

在这个例子中,我们使用一个 buffered channel increment 来传递递增的信号。每个 goroutine 将递增信号发送到 channel 中,而另一个 goroutine 则从 channel 中接收信号并更新计数器。通过使用 channel,我们避免了显式地使用互斥锁,从而简化了代码并提高了程序的安全性。

注意事项

避免死锁: 在使用 sync.Mutex 时,务必小心避免死锁。死锁是指两个或多个 goroutine 互相等待对方释放锁,导致程序无法继续执行的情况。及时释放锁: 在获取锁后,务必确保在退出临界区时释放锁,即使发生错误也应该释放锁,可以使用 defer 语句来确保锁被释放。优先使用 Channels: 在设计并发程序时,应该优先考虑使用 Go channels 来实现并发控制,只有在确实需要使用互斥锁的情况下才使用 sync.Mutex。

总结

sync.Mutex 是 Go 语言中用于保护临界区的互斥锁。通过使用 Lock() 和 Unlock() 方法,可以确保在同一时刻只有一个 goroutine 可以访问共享资源。然而,在设计并发程序时,应该优先考虑使用 Go channels 来实现并发控制,以提高程序的安全性、可读性和可维护性。只有在确实需要使用互斥锁的情况下才使用 sync.Mutex,并务必小心避免死锁。

以上就是Go 并发编程中的互斥执行的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1398481.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
Go语言并发编程:互斥锁实现临界区
上一篇 2025年12月15日 15:28:15
Go 并发编程:互斥锁实现临界区访问控制
下一篇 2025年12月15日 15:28:29

相关推荐

  • iPhone 17系列还没发布就被唱衰!2025年了竟然还有单摄 Air机型电池太拉胯

    iPhone 17系列还没发布就被唱衰!2025年了竟然还有单摄  Air机型电池太拉胯iPhone 17系列还没发布就被唱衰!2025年了竟然还有单摄  Air机型电池太拉胯iPhone 17系列还没发布就被唱衰!2025年了竟然还有单摄  Air机型电池太拉胯iPhone 17系列还没发布就被唱衰!2025年了竟然还有单摄  Air机型电池太拉胯

    8月29日消息,苹果已确认将于9月10日凌晨1点召开2025年秋季新品发布会,届时iphone 17系列将正式登场。然而,新机尚未亮相,市场评价已出现分歧。 本次最受关注的莫过于全新机型iPhone 17 Air,传闻其厚度仅5.5mm,将成为苹果史上最轻薄的智能手机。但这款主打极致轻薄的新机,却提…

    2026年10月10日 • 用户投稿
    600
  • 民间故事推文工具_民间故事AI推文工具精选推荐

    民间故事推文工具能显著提升创作效率,它通过提供丰富素材库、AI续写改编、智能文案生成、配图推荐、排版优化及多平台支持等功能,帮助用户快速生成高质量推文;但AI生成内容需人工审核优化,结合选材、改编、文案润色、配图选择与互动设计等技巧,并辅以对民间故事的深入理解、写作技能提升和持续练习,才能真正创作出…

    2026年10月10日
    100
  • 即梦ai制作数字人使用教程完整版

    即梦ai制作数字人使用教程完整版即梦ai制作数字人使用教程完整版即梦ai制作数字人使用教程完整版即梦ai制作数字人使用教程完整版

    即梦ai制作数字人需要准备高质量照片、安装软件、稳定网络和创意耐心。1.上传照片并进行初步处理。2.调整面部特征、肤色、发型等细节。3.导出成图片、视频或3d模型,并应用于各种场景。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 即梦AI制…

    2026年10月10日 • 用户投稿
    100
  • Linux系列之查找命令

    Linux系列之查找命令Linux系列之查找命令Linux系列之查找命令Linux系列之查找命令

    前言 作为前端开发者,我们有时也会需要与Linux系统打交道,因此掌握一些常用的Linux命令和概念是非常重要的。在接下来的几篇文章中,我们将一起探讨Linux的常用知识点。 Linux有四个常用的查找命令:locate、whereis、which 和 find。本文将介绍它们的区别和基本用法。 l…

    2026年10月10日 • 用户投稿
    200
  • win11系统服务哪些可以禁用_win11不必要的系统服务优化指南

    win11系统服务哪些可以禁用_win11不必要的系统服务优化指南win11系统服务哪些可以禁用_win11不必要的系统服务优化指南win11系统服务哪些可以禁用_win11不必要的系统服务优化指南win11系统服务哪些可以禁用_win11不必要的系统服务优化指南

    禁用非必要系统服务可提升Windows 11性能。通过服务管理器、系统配置工具或命令提示符关闭如SysMain、Windows Search、遥测服务等,释放资源,提高响应速度。 如果您发现Windows 11系统运行缓慢或资源占用过高,很可能是由于后台运行了大量非必要的系统服务。这些服务会持续消耗…

    2026年10月10日 • 用户投稿
    100
  • Java中如何操作Redis?Jedis连接使用方法

    Java中如何操作Redis?Jedis连接使用方法Java中如何操作Redis?Jedis连接使用方法Java中如何操作Redis?Jedis连接使用方法Java中如何操作Redis?Jedis连接使用方法

    在java中使用jedis操作redis,需引入依赖、建立连接并进行数据操作。1. 引入maven依赖:redis.clients:jedis:4.0.1或gradle配置;2. 创建jedis实例连接redis,远程访问需配置bind和密码认证;3. 执行字符串、哈希、列表等常见数据类型操作;4.…

    2026年10月10日 • 用户投稿
    000
  • 8月微信朋友圈十大谣言出炉:雨天用手机打电话会引雷

    8月微信朋友圈十大谣言出炉:雨天用手机打电话会引雷8月微信朋友圈十大谣言出炉:雨天用手机打电话会引雷8月微信朋友圈十大谣言出炉:雨天用手机打电话会引雷8月微信朋友圈十大谣言出炉:雨天用手机打电话会引雷

    8月29日,微信安全中心发布了8月份朋友圈流传的十大谣言,内容涉及“房东税”、医保新政、医疗补助金等社会热点话题。 微信官方提醒用户应保持冷静与理性,不轻信来源不明的信息,及时通过权威渠道核实消息真伪,杜绝传播未经证实的内容,共同营造清朗、安全、可信的网络空间。 1、9月15日起将开征“房东税”? …

    2026年10月10日 • 用户投稿
    200
  • Java中如何开发AR应用?Sceneform框架

    Java中如何开发AR应用?Sceneform框架Java中如何开发AR应用?Sceneform框架Java中如何开发AR应用?Sceneform框架Java中如何开发AR应用?Sceneform框架

    sceneform已经停止维护,其替代方案包括unity ar foundation、arcore sdk、vuforia engine和realitykit。1. unity ar foundation提供跨平台支持,适合易用性和广泛的生态系统;2. arcore sdk适合需要底层控制的项目;3…

    2026年10月10日 • 用户投稿
    200
  • composer.json中的config字段有哪些常用配置

    composer.json中的config字段有哪些常用配置composer.json中的config字段有哪些常用配置composer.json中的config字段有哪些常用配置composer.json中的config字段有哪些常用配置

    config字段用于配置Composer行为,1. vendor-dir自定义依赖目录;2. bin-dir设置可执行文件路径;3. cache-dir指定缓存位置;4. process-timeout调整命令超时;5. preferred-install控制安装方式;6. autoloader-s…

    2026年10月10日 • 用户投稿
    100
  • OpenAI斥30亿美元收购AI辅助编码工具Windsurf

    OpenAI斥30亿美元收购AI辅助编码工具WindsurfOpenAI斥30亿美元收购AI辅助编码工具WindsurfOpenAI斥30亿美元收购AI辅助编码工具WindsurfOpenAI斥30亿美元收购AI辅助编码工具Windsurf

    ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 据报道,知情人士透露,OpenAI已同意以约30亿美元的价格收购人工智能辅助编码工具Windsurf(原名Codeium),这是公司历史上规模最大的一次收购。 据了解,交易尚未最终敲定。Open…

    2026年10月10日 • 用户投稿
    100
  • Java中如何操作图数据库?Neo4j连接方法

    Java中如何操作图数据库?Neo4j连接方法Java中如何操作图数据库?Neo4j连接方法Java中如何操作图数据库?Neo4j连接方法Java中如何操作图数据库?Neo4j连接方法

    在java中操作neo4j图数据库主要有两种常见方式。1. 使用neo4j java driver进行底层连接和查询,适合需要精细控制的项目,通过maven依赖引入驱动并建立连接,可执行cypher语句与数据库交互;2. 使用spring data neo4j(sdn)进行orm操作,适合基于spr…

    2026年10月10日 • 用户投稿
    200
  • 全球搜索平台Baidu在线 Baidu搜索引擎免费访问地址

    全球搜索平台Baidu在线 Baidu搜索引擎免费访问地址全球搜索平台Baidu在线 Baidu搜索引擎免费访问地址全球搜索平台Baidu在线 Baidu搜索引擎免费访问地址全球搜索平台Baidu在线 Baidu搜索引擎免费访问地址

    全球搜索平台Baidu在线免费访问地址是https://www.baidu.com,该网站提供高效精准的搜索、多样化的信息整合服务及便捷的用户交互功能。 全球搜索平台Baidu在线 Baidu搜索引擎免费访问地址在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来全球搜索平台Baidu在线 B…

    2026年10月10日 • 用户投稿
    200
  • 使用Java操作Solr实现全文检索的配置教程

    使用Java操作Solr实现全文检索的配置教程使用Java操作Solr实现全文检索的配置教程使用Java操作Solr实现全文检索的配置教程使用Java操作Solr实现全文检索的配置教程

    要使用java操作solr实现全文检索,首先必须正确配置solr实例并使用solrj客户端库。1. 启动solr并创建核心,用于存储数据;2. 配置schema定义字段及其类型,尤其对中文检索需引入ik analyzer等分词器并定义text_ik字段类型;3. java项目中引入solrj依赖,创…

    2026年10月10日 • 用户投稿
    200
  • Android 应用中动态生成多行多列布局的优化策略

    Android 应用中动态生成多行多列布局的优化策略Android 应用中动态生成多行多列布局的优化策略Android 应用中动态生成多行多列布局的优化策略Android 应用中动态生成多行多列布局的优化策略

    本文旨在探讨在Android应用中高效动态生成多行多列布局的方法。针对直接通过代码创建大量视图的低效问题,文章重点介绍了两种优化策略:首推使用 RecyclerView 实现视图复用和性能优化,适用于处理大量数据;其次,对于中小型规模的动态布局,可利用 LayoutInflater 从XML布局文件…

    2026年10月9日 • 用户投稿
    100
  • deepseek和豆包有什么区别 谁才是你的最佳AI拍档

    deepseek和豆包有什么区别 谁才是你的最佳AI拍档deepseek和豆包有什么区别 谁才是你的最佳AI拍档deepseek和豆包有什么区别 谁才是你的最佳AI拍档deepseek和豆包有什么区别 谁才是你的最佳AI拍档

    在ai技术迅猛发展的当下,各类智能助手不断涌现,deepseek与豆包作为国内备受关注的两大ai平台,究竟有何不同?一起来了解一下吧~ 一、核心优势各有所长 1、DeepSeek:专注专业领域 主打“深度专业化”,在代码生成、数据分析、科研推理等高门槛场景中表现亮眼。依托自研的千亿参数大模型,擅长处…

    2026年10月9日 • 用户投稿
    200
  • Intel 18A工艺至强处理器站起来了:8倍整合效益提升

    Intel 18A工艺至强处理器站起来了:8倍整合效益提升Intel 18A工艺至强处理器站起来了:8倍整合效益提升Intel 18A工艺至强处理器站起来了:8倍整合效益提升Intel 18A工艺至强处理器站起来了:8倍整合效益提升

    8月31日,intel的“四年五制程”战略将迎来关键节点——年底即将量产其18a工艺。届时,除了桌面端的nave lake与移动端的panther lake外,还将推出两款服务器级处理器:diamond rapids和clearwater forest,均基于全新18a工艺打造。 这两款新品预计将归…

    2026年10月9日 • 用户投稿
    100
  • Macbook如何录制屏幕视频_Mac自带屏幕录像功能使用教程

    Macbook如何录制屏幕视频_Mac自带屏幕录像功能使用教程Macbook如何录制屏幕视频_Mac自带屏幕录像功能使用教程Macbook如何录制屏幕视频_Mac自带屏幕录像功能使用教程Macbook如何录制屏幕视频_Mac自带屏幕录像功能使用教程

    使用快捷键 Command+Shift+5 可快速调用系统录屏功能,支持全屏或区域录制,设置音频来源和鼠标点击显示后开始录制,视频自动保存为 .mov 格式;2. 通过 QuickTime Player 新建屏幕录制可进行更精细配置,选择麦克风和显示鼠标点击效果后录制,操作灵活适用于专业需求。 如果…

    2026年10月9日 • 用户投稿
    200
  • Android动态布局:高效创建可滚动表格与列表的策略

    Android动态布局:高效创建可滚动表格与列表的策略Android动态布局:高效创建可滚动表格与列表的策略Android动态布局:高效创建可滚动表格与列表的策略Android动态布局:高效创建可滚动表格与列表的策略

    在Android应用开发中,动态生成大量可滚动视图,特别是表格状数据,若采用传统方式(如循环创建并直接添加视图)会导致严重的性能和内存问题。本文旨在提供两种高效的解决方案:首选是利用RecyclerView实现视图复用和优化滚动体验;其次,对于非大规模场景,可利用LayoutInflater从XML…

    2026年10月9日 • 用户投稿
    100
  • 豆包AI如何批改作文作业?智能评分系统

    豆包AI如何批改作文作业?智能评分系统豆包AI如何批改作文作业?智能评分系统豆包AI如何批改作文作业?智能评分系统豆包AI如何批改作文作业?智能评分系统

    豆包ai通过语法、词汇、结构、内容和风格五个维度评分作文。1.检查语法和拼写错误;2.评估词汇丰富性和准确性;3.分析逻辑结构和连贯性;4.评估内容深度和原创性,每个维度生成具体分数和反馈。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 豆…

    2026年10月9日 • 用户投稿
    100
  • 钉钉CEO凌晨12点查岗 称筛选“同道者” 员工:99%的人离职都是因为他

    钉钉CEO凌晨12点查岗 称筛选“同道者”  员工:99%的人离职都是因为他钉钉CEO凌晨12点查岗 称筛选“同道者”  员工:99%的人离职都是因为他钉钉CEO凌晨12点查岗 称筛选“同道者”  员工:99%的人离职都是因为他钉钉CEO凌晨12点查岗 称筛选“同道者”  员工:99%的人离职都是因为他

    8月31日消息,近日,因“凌晨查岗”的报道,钉钉ceo无招被推上舆论风口。 2025年4月回归钉钉四个月后,钉钉创始人、CEO无招(原名陈航)于8月25日发布了全新的钉钉8.0版本,命名为“AI钉钉1.0”。然而,发布会前夕,“凌晨查岗”事件在网络上发酵,迅速登上微博热搜,引发广泛讨论。 据《中国企…

    2026年10月9日 • 用户投稿
    200

发表回复

登录后才能评论
关注微信