概述

调用 sync/atomic 包即可。

谬误的并发操作

先来看一个谬误的示例。

通过启动 1000 个 goroutine 来模仿并发调用,在函数外部对变量 number 进行自增操作,
那么可能存在的一个问题是,当多个 goroutine 同时对变量操作时,只有一个胜利了,其余的全副失败,造成的结果就是变量最终的值小于 1000 (失常状况应该是等于 1000)。

package mainimport (    "fmt"    "sync")func main() {    var number uint32    var wg sync.WaitGroup    for i := 0; i < 1000; i++ {        wg.Add(1)        go func() {            defer func() {                wg.Done()            }()            number++        }()    }    wg.Wait()    fmt.Printf("number = %d\n", number)}// $ go run main.go// 输入如下,你的输入可能和这里的不一样,多试几次,会发现每次的后果都不一样/**  number = 971*/

正确的并发操作

package mainimport (    "fmt"    "sync"    "sync/atomic")func main() {    var number uint32    var wg sync.WaitGroup    for i := 0; i < 1000; i++ {        wg.Add(1)        go func() {            defer func() {                wg.Done()            }()            //number++            atomic.AddUint32(&number, 1) // 应用原子操作        }()    }    wg.Wait()    fmt.Printf("number = %d\n", number)}// $ go run main.go// 输入如下,多试几次,会发现后果都是一样的/**  number = 1000*/

分割我