天天看點

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