加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

golang语言中sync/atomic包的学习与使用

发布时间:2020-12-16 18:02:19 所属栏目:大数据 来源:网络整理
导读:package main;import ("sync/atomic""fmt""sync")//atomic包提供了底层的原子级内存操作//类型共有六种:int32,int64,uint32,uint64,uintptr,unsafe.Pinter//操作共五种:增减, 比较并交换, 载入, 存储,交换func main() {//增减操作var a int32;fmt.Prin
package main;

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

//atomic包提供了底层的原子级内存操作
//类型共有六种:int32,int64,uint32,uint64,uintptr,unsafe.Pinter
//操作共五种:增减, 比较并交换, 载入, 存储,交换

func main() {

	//增减操作
	var a int32;
	fmt.Println("a : ",a);
	//函数名以Add为前缀,加具体类型名
	//参数一,是指针类型
	//参数二,与参数一类型总是相同
	//增操作
	new_a := atomic.AddInt32(&a,3);
	fmt.Println("new_a : ",new_a);
	//减操作
	new_a = atomic.AddInt32(&a,-2);
	fmt.Println("new_a : ",new_a);

	//CAS(Compare And Swap)比较并交换操作
	//函数名以CompareAndSwap为前缀,并具体类型名
	var b int32;
	fmt.Println("b : ",b);
	//函数会先判断参数一指向的值与参数二是否相等,如果相等,则用参数三替换参数一的值。
	//最后返回是否替换成功
	atomic.CompareAndSwapInt32(&b,3);
	fmt.Println("b : ",b);

	//载入操作
	//当我们对某个变量进行读取操作时,可能该变量正在被其他操作改变,或许我们读取的是被修改了一半的数据。
	//所以我们通过Load这类函数来确保我们正确的读取
	//函数名以Load为前缀,加具体类型名
	var c int32;
	wg := sync.WaitGroup{};
	//我们启100个goroutine
	for i := 0; i < 100; i++ {
		wg.Add(1);
		go func() {
			defer wg.Done();
			tmp := atomic.LoadInt32(&c);
			if !atomic.CompareAndSwapInt32(&c,tmp,(tmp + 1)) {
				fmt.Println("c 修改失败");
			}
		}();
	}
	wg.Wait();
	//c的值有可能不等于100,频繁修改变量值情况下,CAS操作有可能不成功。
	fmt.Println("c : ",c);

	//存储操作
	//与载入函数相对应,提供原子的存储函数
	//函数名以Store为前缀,加具体类型名
	var d int32;
	fmt.Println("d : ",d);
	//存储某个值时,任何CPU都不会都该值进行读或写操作
	//存储操作总会成功,它不关心旧值是什么,与CAS不同
	atomic.StoreInt32(&d,666);
	fmt.Println("d : ",d);

	//交换操作
	//直接设置新值,返回旧值,与CAS不同,它不关心旧值。
	//函数名以Swap为前缀,加具体类型名
	var e int32;
	wg2 := sync.WaitGroup{};
	//我们启10个goroutine
	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);
}

  

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读