一个关于 sync.Mutex 锁不起作用的问题

最近在学 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,但是结果竟然是随机的,临表涕零。

阅读 1.5k
1 个回答

var locker sync.Mutex
移动到 for 上面

或者使用
atomic.AddInt64()

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题