GO atomic包

需求

对变量并发执行10000次相加

示例1:裸奔

package main

import (
    "fmt"
    "sync"
)

var xx int
var wg111 sync.WaitGroup


func add() {
    xx++
    wg111.Done()
}

func main() {
    wg111.Add(100000)
    for i:=0; i < 100000; i++ {
        go add()
    }
    wg111.Wait()
    fmt.Println(xx)
}

执行1:

90069

执行2:
90126

每次执行不一样。原因:xx++ 等价于xx = xx+1,非原子操作,并行执行的2个会把结果冲掉

 

示例2:加锁

package main

import (
    "fmt"
    "sync"
)

var xx int
var wg111 sync.WaitGroup
var lock111 sync.Mutex


func add() {
    lock111.Lock()
    xx++
    lock111.Unlock()
    wg111.Done()
}

func main() {
    wg111.Add(100000)
    for i:=0; i < 100000; i++ {
        go add()
    }
    wg111.Wait()
    fmt.Println(xx)
}

执行:

每次都是:100000

 

示例3:使用atomic

atomic包提供了底层的原子级内存操作

package main

import (
    "fmt"
    "sync"
    "sync/atomic"
)

var xx int32
var wg111 sync.WaitGroup

func add() {
    atomic.AddInt32(&xx, 1)
    wg111.Done()
}

func main() {
    wg111.Add(100000)
    for i:=0; i < 100000; i++ {
        go add()
    }
    wg111.Wait()
    fmt.Println(xx)
}

执行:

每次都是:100000

其他atomic 操作参考

posted @ 2022-02-13 23:02  jihite  阅读(115)  评论(2编辑  收藏  举报