go atomic包分析
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了go atomic包分析相关的知识,希望对你有一定的参考价值。
参考技术A atomic包是go中在并发情况下必用到的包,可以基于原子性对数值进行操作,所以经常用来加减锁操作,这个包的注释里面解释了这个包的作用,还有那句著名的 用通信的方式来共享内存,不要用共享内存方式来通信。// Share memory by communicating;
// don't communicate by sharing memory.
sync/atomic中的几个函数可以对几种简单的类型进行原子操作。这些类型包括int32,int64,uint32,uint64,uintptr,unsafe.Pointer,共6个。这些函数的原子操作共有5种:增或减,比较并交换、载入、存储和交换它们提供了不同的功能,切使用的场景也有区别。
常用的方法有几种
1、增或减
给值增加或减少一个值。
第一个参数是原值,第二个是要增加多少(如果是负数就是减少多少)
2、比较并交换
比较并交换----Compare And Swap 简称CAS 这也是sync进行锁操作的基础,sync mutex 就是基于这个此方法来判断是否获取了锁
第一个参数是要判断的值,第二个参数是旧值,第三个是新值,第一个和第二个值进行判断,如果一样,就用第三个参数新值来进行替换。根据这个判断可以判断锁是否已被占用。
3、读取
原子性的读取一个值
4、写入
与读操作对应的是写入操作,sync/atomic也提供了与原子的值载入函数相对应的原子的值存储函数。这些函数的名称均以“Store”为前缀
5、交换
与CAS不同,交换操作直接赋予新值,不管旧值。返回值是旧值
总结:atomic包适用于并发量大的情况下对值的修改情况,因为是原子操作,可以做计数器或者加锁等功能。下一篇准备对go string包进行一下分析
Go语言,用原子函数atomic避免资源竞争
下一步应该是互斥锁了。
package main import ( "fmt" "runtime" "sync" "sync/atomic" ) var ( counter int64 wg sync.WaitGroup ) func main() { wg.Add(2) fmt.Println("Create Goroutines") go incCounter(1) go incCounter(2) fmt.Println("Waiting To Finish") wg.Wait() fmt.Println("Final Counter:", counter) } func incCounter(id int) { defer wg.Done() for count := 0; count < 2; count++ { atomic.AddInt64(&counter, 1) runtime.Gosched() } }
以上是关于go atomic包分析的主要内容,如果未能解决你的问题,请参考以下文章