Go并发编程中sync.Mutex锁失效的原因是什么?

go并发编程中sync.mutex锁失效的原因是什么?

Go并发编程中sync.Mutex锁失效原因及解决方案

在Go并发编程中,sync.Mutex常用于保护共享资源,确保数据一致性。本文分析一个使用sync.Mutex和sync.WaitGroup但结果不符合预期的例子,并探讨其原因和解决方法。

问题:代码意图是使用1000个协程对变量a进行1000次加1操作,预期结果a为1000。但实际运行结果却随机,这是因为sync.Mutex使用错误。

原因:原代码中,每个协程都创建了一个独立的sync.Mutex实例:var locker sync.Mutex。这意味着每个协程拥有自己的锁,互不干扰,导致多个协程同时修改a,结果不准确。

解决方案:

方法一:将var locker sync.Mutex声明移到for循环外部。这样,所有协程共享同一个sync.Mutex实例,保证同一时刻只有一个协程访问和修改a。修改后的代码如下:

package mainimport (    "fmt"    "sync")func main() {    var a = 0    var wg sync.WaitGroup    var locker sync.Mutex // 将锁声明移至此处    for i := 0; i < 1000; i++ {        wg.Add(1)        go func(i int) {            defer wg.Done()            locker.Lock() // 使用共享锁            a++            locker.Unlock()        }(i)    }    wg.Wait()    fmt.Println("a =", a) // 输出 a = 1000}

登录后复制

本文来自互联网或AI生成,不代表软件指南立场。本站不负任何法律责任。

如若转载请注明出处:http://www.down96.com/tutorials/1897.html

热心网友热心网友
上一篇 2025-04-11 14:19
下一篇 2025-04-11 14:19

相关推荐

本站[软件指南]所有内容来自互联网投稿或AI智能生成,并不代表软件指南的立场。