go atomic包分析

Python012

go atomic包分析,第1张

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包中对几种基础类型提供了原子操作,包括int32,int64,uint32,uint64,uintptr,unsafe.Pointer。

对于每一种类型,提供了五类原子操作分别是

Load和Store操作对应与变量的原子性读写,许多变量的读写无法在一个时钟周期内完成,而此时执行可能会被调度到其他线程,无法保证并发安全。

⚠️Load 只保证读取的不是正在写入的值,Store只保证写入是原子操作。

所以在使用的时候要注意。

下面简单示例:

点击