最近在学 go,使用 sync.Mutex 和 sync.WaitGroup 写了个小例子,没想到翻车了,硬是没搞懂,希望大神指点一下,下面的代码哪里出问题了,谢谢,感激涕零。
package main
import (
"fmt"
"sync"
"time"
)
/**
这个例子主要演示 sync 锁的用法,用 1000 个协程对一个变量加 1000,每个协程 +1,看最终的结果
*/
func main() {
//这个方法使用了 sync 锁和 sync Wait ,保证了同一时刻只有一个协程对同一个变量操作并且等待所有操作结束才输出最终结果
hasLockAndWait()
}
func hasLockAndWait() {
var a = 0
var wg sync.WaitGroup
for i := 0; i < 1000; i++ {
wg.Add(1)
go func() {
defer wg.Done()
var locker sync.Mutex
locker.Lock()
defer locker.Unlock()
a++
fmt.Println("a 的值为:", a)
}()
}
wg.Wait()
fmt.Println("a 的最终值为:", a)
}
我希望最终的值为 1000,但是结果竟然是随机的,临表涕零。
var locker sync.Mutex
移动到 for 上面
或者使用
atomic.AddInt64()