Golang sync并发同步工具使用示例

sync.Mutex用于保护共享资源,防止数据竞争;示例中多个goroutine通过加锁实现安全的计数器递增操作。

golang sync并发同步工具使用示例

在Go语言中,sync包提供了多种并发同步工具,用于协调多个goroutine之间的执行。这些工具能有效避免竞态条件(race condition),确保共享资源的安全访问。下面介绍几种常用的sync工具及其使用示例。

sync.Mutex:互斥锁

当多个goroutine需要修改同一变量时,使用sync.Mutex可以防止数据竞争。

示例:多个goroutine对计数器进行递增操作:

package mainimport (    "fmt"    "sync"    "time")var (    counter = 0    mutex   sync.Mutex)func increment(wg *sync.WaitGroup) {    defer wg.Done()    for i := 0; i < 1000; i++ {        mutex.Lock()        counter++        mutex.Unlock()    }}func main() {    var wg sync.WaitGroup    for i := 0; i < 5; i++ {        wg.Add(1)        go increment(&wg)    }    wg.Wait()    fmt.Println("最终计数器值:", counter) // 应为5000}

通过加锁保护counter变量,确保每次只有一个goroutine能修改它。

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

sync.RWMutex:读写锁

适用于读多写少的场景。RWMutex允许多个读操作同时进行,但写操作独占。

示例:缓存读写控制:

var (    data     = make(map[string]int)    rwMutex  sync.RWMutex)func read(key string) int {    rwMutex.RLock()    defer rwMutex.RUnlock()    return data[key]}func write(key string, value int) {    rwMutex.Lock()    defer rwMutex.Unlock()    data[key] = value}

读操作用RLock,写操作用Lock,提高并发性能。

sync.WaitGroup:等待一组goroutine完成

WaitGroup用于主线程等待所有子goroutine执行完毕。

常见于批量任务处理:

func doTask(id int, wg *sync.WaitGroup) {    defer wg.Done()    fmt.Printf("任务 %d 完成n", id)    time.Sleep(time.Second)}func main() {    var wg sync.WaitGroup    for i := 1; i <= 3; i++ {        wg.Add(1)        go doTask(i, &wg)    }    wg.Wait()    fmt.Println("所有任务结束")}

每启动一个goroutine就Add(1),任务完成调用Done(),Wait()阻塞直到计数归零。

sync.Once:确保只执行一次

常用于单例初始化或配置加载,保证某段代码仅运行一次。

var (    configLoaded bool    config       string    once         sync.Once)func loadConfig() {    once.Do(func() {        fmt.Println("正在加载配置...")        config = "loaded"        configLoaded = true    })}func main() {    for i := 0; i < 3; i++ {        go loadConfig()    }    time.Sleep(time.Second)}

尽管被多个goroutine调用,loadConfig中的初始化逻辑只会执行一次。

基本上就这些。合理使用sync工具能显著提升程序的并发安全性与效率。注意避免死锁,比如不要重复加锁或忘记解锁。调试时建议开启-race检测竞态条件。

以上就是Golang sync并发同步工具使用示例的详细内容,更多请关注创想鸟其它相关文章!

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

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
Golang如何进行类型推断
上一篇 2025年12月16日 03:54:58
使用 Go 语言生成大 CSV 文件用于测试
下一篇 2025年12月16日 03:55:05

相关推荐

发表回复

登录后才能评论
关注微信