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 操作參考

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章