Golang如何使用 sync 包实现并发安全_Golang sync 互斥锁与 WaitGroup 实例


使用 sync.Mutex 和 sync.WaitGroup 可解决 Go 中的并发安全与协程同步问题。Mutex 通过加锁保护共享资源,如计数器示例中防止竞态;WaitGroup 用于等待所有 goroutine 完成,如下载任务示例中确保全部执行完毕;二者常结合使用,如在并发处理任务时统计成功失败次数,既保证数据安全又正确同步结束状态。

golang如何使用 sync 包实现并发安全_golang sync 互斥锁与 waitgroup 实例

在 Go 语言中,并发编程是其核心优势之一。但多个 goroutine 同时访问共享资源时,容易引发数据竞争问题。为保证并发安全,Go 提供了 sync 包,其中最常用的两个类型是 sync.Mutex(互斥锁)和 sync.WaitGroup(等待组)。下面通过实例说明它们的使用方法。

使用 sync.Mutex 实现并发安全

当多个 goroutine 同时读写同一个变量时,比如一个计数器,不加保护会导致结果错误。这时可以使用 sync.Mutex 来确保同一时间只有一个 goroutine 能访问临界区。

示例:并发安全的计数器

定义一个带锁的计数器结构体:

package main
<p>import (
"fmt"
"sync"
)</p><p>type Counter struct {
mu    sync.Mutex
value int
}</p><p>func (c *Counter) Inc() {
c.mu.Lock()
defer c.mu.Unlock()
c.value++
}</p><p>func (c *Counter) Value() int {
c.mu.Lock()
defer c.mu.Unlock()
return c.value
}</p><p>func main() {
var counter Counter
var wg sync.WaitGroup</p><pre class="brush:php;toolbar:false;">for i := 0; i < 1000; i++ {
    wg.Add(1)
    go func() {
        defer wg.Done()
        counter.Inc()
    }()
}

wg.Wait()
fmt.Println("Final count:", counter.Value()) // 输出: Final count: 1000

}

在这个例子中,每次调用 Inc() 都会先获取锁,操作完成后释放锁,避免多个 goroutine 同时修改 value 导致竞态。

使用 sync.WaitGroup 等待所有 goroutine 完成

WaitGroup 用于等待一组并发任务完成。它内部维护一个计数器,调用 Add() 增加计数,每个任务执行完后调用 Done()(相当于 Add(-1)),主线程通过 Wait() 阻塞直到计数归零。

示例:并发下载任务等待

会译·对照式翻译 会译·对照式翻译

会译是一款AI智能翻译浏览器插件,支持多语种对照式翻译

会译·对照式翻译 79 查看详情 会译·对照式翻译

模拟多个任务并发执行并等待全部完成:

package main
<p>import (
"fmt"
"time"
)</p><p>func download(url string, wg *sync.WaitGroup) {
defer wg.Done()
fmt.Println("开始下载:", url)
time.Sleep(time.Second) // 模拟耗时
fmt.Println("完成下载:", url)
}</p><p>func main() {
var wg sync.WaitGroup
urls := []string{
"<a href="https://www.php.cn/link/0a16224c296f72af9037875a027f94a6">https://www.php.cn/link/0a16224c296f72af9037875a027f94a6</a>",
"<a href="https://www.php.cn/link/6f942b9867c5426a14f5841ece172b18">https://www.php.cn/link/6f942b9867c5426a14f5841ece172b18</a>",
"<a href="https://www.php.cn/link/909c71100210781d37a568c5fc14e627">https://www.php.cn/link/909c71100210781d37a568c5fc14e627</a>",
}</p><pre class="brush:php;toolbar:false;">for _, url := range urls {
    wg.Add(1)
    go download(url, &wg)
}

wg.Wait()
fmt.Println("所有下载任务已完成")

}

注意:WaitGroup 的 Add() 应在 goroutine 启动前调用,否则可能因调度问题导致 Wait 提前结束。

Mutex 与 WaitGroup 结合使用场景

实际开发中,两者常结合使用。例如在并发处理数据并更新共享状态时,既要等待所有任务完成,又要保护共享数据。

综合示例:并发处理并统计成功数

package main
<p>import (
"fmt"
"math/rand"
"sync"
"time"
)</p><p>type Result struct {
mu      sync.Mutex
success int
failed  int
}</p><p>func (r *Result) Record(success bool) {
r.mu.Lock()
defer r.mu.Unlock()
if success {
r.success++
} else {
r.failed++
}
}</p><p>func processTask(id int, result <em>Result, wg </em>sync.WaitGroup) {
defer wg.Done()
time.Sleep(time.Duration(rand.Intn(500)) * time.Millisecond)
if rand.Float32() > 0.3 {
result.Record(true)
} else {
result.Record(false)
}
}</p><p>func main() {
var wg sync.WaitGroup
var result Result
const taskCount = 10</p><pre class="brush:php;toolbar:false;">for i := 0; i < taskCount; i++ {
    wg.Add(1)
    go processTask(i, &result, &wg)
}

wg.Wait()

fmt.Printf("处理完成: 成功=%d, 失败=%d\n", result.success, result.failed)

}

这个例子展示了如何安全地在并发环境中更新共享状态,并确保主线程等待所有任务结束。

基本上就这些。掌握 sync.Mutexsync.WaitGroup 是编写正确并发程序的基础。合理使用它们能有效避免数据竞争,提升程序稳定性。

以上就是Golang如何使用 sync 包实现并发安全_Golang sync 互斥锁与 WaitGroup 实例的详细内容,更多请关注其它相关文章!


# golang  # 只有一个  # 又要  # 中文网  # 相关文章  # 在这个  # 互斥  # 器中  # 多个  # 并发编程  # ai  # go  # 如何使用  # 天门网站推广服务  # 淘宝店铺营销推广引流方案  # 重庆推广大数据营销前景  # 罗湖seo网站  # 无锡快手推广招聘网站  # 重庆百度关键词排名优化  # 主动营销的推广文案范文  # 永和网站推广公司电话  # 清远银川网站推广  # 住总如院营销推广图  # 解决问题 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894


相关推荐: 歌词怎么展示在|直播|间视频号?有什么注意事项?  《花瓣》创建专辑方法  Go语言反射机制:如何访问被嵌入结构体遮蔽的方法  暴风影音官网正式版_暴风影音手机版官网下载安卓  从J*a应用程序中导出MySQL表数据的技术指南  中大网校app做题记录清除方法  优化响应式标题底部边框:CSS实现技巧与最佳实践  苹果电脑如何快速查看电池状态 苹果电脑电池信息快捷方法  手机雨课堂网页版入口免登录 雨课堂网页版可点击直接进入  六级准考证号怎么查_四六级准考证查询入口官网  创客贴登录页面入口 创客贴网页版最新网址链接  快递物流路径揭秘  12306夜间购票失败? | 查看官方公布的暂停服务公告与应对方案  《i莞家》修改昵称方法  搜狗浏览器如何查找页面中的文字 搜狗浏览器Ctrl+F页面搜索功能  iQOO手机信号差网络不稳定怎么办 信号问题原因排查与增强设置【攻略】  顺丰官方查单号入口 顺丰快递单号查询官网入口  实时数据流中高效查找最小值与最大值  Google Cloud Functions 时区处理指南:理解与最佳实践  使用VS Code作为你的个人知识管理系统  PHP utf8_encode 字符编码转换陷阱与解决方案  Symfony路由参数转换器:实体存在性验证与错误处理策略  《360浏览器》设置摄像头权限方法  《tt语音》超级玩家开通方法  《饿了么》拼好饭点外卖教程2025  邮政快递寄件查询入口 邮政快递收件查询入口  CDR如何复制交互式填充色  汽水音乐在线听歌网页版 汽水音乐在线听歌网页版入口  163邮箱登录入口官网 163.com邮箱登录入口  Coolpad5890 ROM刷机包  掌握CSS :has() 选择器:父选择器、嵌套限制与常见陷阱解析  《画加》约稿流程  解决CSS布局中意外顶部空白问题的教程  OpenWeatherMap API:通过城市名称获取天气预报数据指南  《合金装备4》有望推出重制版!制作人发话了  mysql中如何配置字符集和排序规则_mysql字符集排序配置  Go反射进阶:访问内嵌结构体中的被遮蔽方法  J*a里如何处理ArithmeticException并防止除零_算术异常防护策略解析  QQ网页版入口导航 QQ网页版在线访问通道  《原神》月之一版本新增书籍一览  顺丰快递收费标准查询_如何查看顺丰最新收费价格  Magento 2 产品保存事件中安全更新属性的最佳实践  php如何实现多域名共享session_php存储session到redis与跨域读取配置  《全民k歌》音乐怎么下载到本地2025  汽车之家网页版免费登录_汽车之家官网首页直接进入  PHP与SQL实践:高效实现数据复制与特定列值修改  菜鸟裹裹怎样获得取件码_菜鸟裹裹获得取件码步骤  多闪电脑版下载_多闪PC端模拟器使用  如何在mysql中使用索引提示_mysql索引提示优化方法  Lar*el Eloquent中通过Join查询关联数据表:解决多行子查询问题 

 2025-11-21

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.