包:sync/atomic
代码:
package main
import (
"sync/atomic"
"strconv"
"fmt"
"sync"
)func main() {
var a int32;
fmt.Println("a : ", a);
// 增加
new_a:=atomic.AddInt32(&a,3)
fmt.Println("new_a ",new_a)
//减少
new_a=atomic.AddInt32(&a,-2)
fmt.Println("new_a ",new_a)
// 比较并替换,变量b和0 比较,如果b和0不相等,那么b被赋值为3
var b int32;
fmt.Println("b :",b)
atomic.CompareAndSwapInt32(&b,0,3)
fmt.Println("b: ",b)
// 载入,保证读取的原子性,如果再读取的过程中,存在需改,那么修改将不会成功,主要用于goroutine中
var c int32
// 如果wg不等于0,那么将阻塞主线程,直到goroutine为0
wg:=sync.WaitGroup{}
for i :=0;i<100;i++{
wg.Add(1)
go func(){
//相当于wg-1 ,减去当前线程
defer wg.Done()
//载入
tmp:=atomic.LoadInt32(&c)
//交换
if !atomic.CompareAndSwapInt32(&c,tmp,(tmp+1)){
fmt.Println("c modify failed")
}
// else{
// fmt.Println("c modify success")
//}
}();
}
var d int32
fmt.Println("d : ",d)
atomic.StoreInt32(&d,666)
fmt.Println("d : ",d)
var e int32
wg2:=sync.WaitGroup{}
for i:=0;i<10;i++ {
wg2.Add(1)
go func() {
defer wg2.Done()
tmp := atomic.LoadInt32(&e)
//设置新值,返回旧值
old := atomic.SwapInt32(&e, (tmp +1))
fmt.Println("e old: ", old)
}()
}
wg2.Wait()
fmt.Println("e : ",e)
}
有疑问加站长微信联系(非本文作者)