go并发编程:sync.mutex失效及解决方案
本文分析一个Go并发编程案例,演示了sync.Mutex失效导致并发计数结果不准确的原因,并提供两种解决方案。 案例目标是使用1000个协程对一个变量进行累加,预期结果为1000,但实际结果却往往是随机值。
问题代码:
原代码错误地将sync.Mutex的声明放在for循环内部,导致每个协程都创建了一个独立的锁,无法保证对共享变量的原子操作。
package mainimport ( "fmt" "sync" "time")func haslockandwait() { var a = 0 var wg sync.WaitGroup for i := 0; i < 1000; i++ { wg.Add(1) go func(i int) { defer wg.Done() var locker sync.Mutex // 错误:每个协程都有独立的锁 locker.Lock() a++ locker.Unlock() }(i) } wg.Wait() fmt.Println("最终结果:", a)}
登录后复制
本文来自互联网或AI生成,不代表软件指南立场。本站不负任何法律责任。