原子操作
直接看atomic的AddInt32不太好理解, 增加一個case進行操作就可以熟練了解;
- TOTAL基數較小的時候,並不存在問題;
- TOTAL較大的時候就可以看出,多並發的情況下對共享資源的爭搶就會導致增加失敗;
- LoadInt32 在等待當前有在對該變量執行的go,如果routine一直對某個值在寫,則響應的routine一直在等待呢?
- atomic.CompareAndSwapInt32, 該值可以在AddInt32的同時進行判斷,是否進行追加交互處理;
atomic.AddInst32(old int32, delta)
示范代碼
package main
import (
"fmt"
"sync"
"sync/atomic"
"time"
)
const TOTAL = 10000
var wg sync.WaitGroup
func main() {
fmt.Println("hello atomic")
var num,num1 int32
wg.Add(1)
for i := 0; i < TOTAL; i++ {
go AddNum(&num)
go AddNumD(&num1)
}
time.Sleep(time.Second * 2)
fmt.Println(num, num1)
wg.Wait()
}
func AddNum(num *int32) {
atomic.AddInt32(num, 1)
}
func AddNumD(num *int32) {
*num++
}
