单机程序并发或并行修改全局变量时,需要对修改行为加锁以创造临界区。如果不加锁,得到的结果将不准确,如:

package main

import (
    "sync"
)

// 全局变量
var counter int

func main() {
    var wg sync.WaitGroup
    for i := 0; i < 1000; i++ {
        wg.Add(1)
        go func() {
        defer wg.Done()
            counter++
        }()
    }

    wg.Wait()
    println(counter)
}

多次运行结果不同:

go run main.go              
884
➜  go run main.go
957
➜  go run main.go
923
最后编辑: kuteng  文档更新时间: 2022-03-29 17:59   作者:kuteng