golang 通过sync/atomic库来支持cpu和操作系统级别的原子操作。但是对要操作类型有如下要求

  • int32, int64,uint32, uint64,uintptr,unsafe包中的Pointer。不过,针对unsafe.Pointer类型,该包并未提供进行原子加法操作的函数

sync/atomic 提供的原子操作有

  • 加法(add), 比较并交换(compare and swap, 简称CAS),加载(load), 存储(store),交换(swap)

针对sync/atomic支持的类型,会有注入atomic.AddInt32这样的函数提供支持

import ("fmt""sync/atomic"
)func main() {var a uint32 = 10atomic.AddUint32(&a, 1)fmt.Println(a)// uint32需要一个非负整数,uint32(int32(-1)), 会被编译器报错,需要一个中间变量b来绕过b := int32(-1)atomic.AddUint32(&a, uint32(b))fmt.Println(a)// ^uint32(n-1), n为要减去的数// 整数在计算机以补码形式存在,这里的异或求出来的补码与b的补码相同atomic.AddUint32(&a, ^uint32(3-1))fmt.Println(a)
}

上面的代码有几个点需要注意:

  1. 传递给atomic.AddUint32函数的必须是指针类型。同理,unsafe.Pointer也是如此
  2. 对于atomic.AddUint64函数做原子减法,有两种方法,具体看代码

sync/atomic 比较并交换操作与交换操作的异同:

  • 比较并交换操作即CAS操作,是有条件的交换操作,只有在条件满足的情况下才会进行值的交换
func main() {var a int32 = 0go func() {for {fmt.Println(a)// 当a ==  10,就设置 a=0,并返回tureif atomic.CompareAndSwapInt32(&a, 10, 0) {fmt.Println("The second number has gone to zero.")break}time.Sleep(time.Millisecond * 500)}}()for {a++if a >10 {break}time.Sleep(time.Millisecond * 600)}
}

sync/automic.Value

  • sync/automic.Value相当于一个容器,可以被用来"原子地"存储和加载任意的值

atomic.Value使用事项

  • 不用初始化,声明后即可使用。有两个指针方法Store和Load
  • atomic.Value类型属于结构体类型,而结构体属于值类型,因此对该值的赋值,都会产生新的副本。
  • 不能存储nil。
  • 第一个存入的值类型,决定了后续atomic.Value可以存入的值

转载于:https://www.cnblogs.com/linyihai/p/10258324.html

原子操作--sync/atomic的用法相关推荐

  1. Go原子操作 sync/atomic

    sync/atomic包提供了底层的原子级内存操作,其执行过程不能被中断,这也就保证了同一时刻一个线程的执行不会被其他线程中断,也保证了多线程下数据操作的一致性. 操作的数据类型共有六种:int32, ...

  2. 原子操作之sync/atomic

    2019独角兽企业重金招聘Python工程师标准>>> 原子操作之sync/atomic 对于并发操作而言,原子操作是个非常现实的问题.典型的就是i++的问题. 当两个CPU同时对内 ...

  3. Golang 中 sync/atomic 包的原子操作

    背景 Go中多协程的情况下, 要保证操作的原子性,一般要使用RWMutex或者Mutex, 但是锁使用起来比较复杂,还要考虑lock 和unlock 顺序和成对出现,不注意就容易出错. 于是在sync ...

  4. sync/atomic 库使用小结

    sync/atomic 库提供了原子操作的支持,原子操作直接有底层CPU硬件支持,因而一般要比基于操作系统API的锁方式效率高些.本文对 sync/atomic 中的基本操作进行一个简单的介绍. 原子 ...

  5. Go 学习笔记(23)— 并发(02)[竞争,锁资源,原子函数sync/atomic、互斥锁sync.Mutex]

    本文参考 <Go 语言实战> 1. 竞争状态简述 如果两个或者多个 goroutine 在没有互相同步的情况下,访问某个共享的资源,并试图同时读和写这个资源,就处于相互竞争的状态,这种情况 ...

  6. Go sync.WaitGroup的用法

    介绍 经常会看到以下了代码: package mainimport ("fmt""time" )func main(){for i := 0; i < 1 ...

  7. .sync的一个用法

    面试时,有人问了我修饰符是什么,就是一个点后面加一个单词,我当时还以为是什么文件夹后缀呢.很是尴尬 这里主要学习下.sync的一个用法 假设下场景: 这里有一个父组件,父组件中有个money,需要传到 ...

  8. 原子(atom)本意是“不能被进一步分割的最小粒子”,而原子操作(atomic operation)

    1. 引言 原子(atom)本意是"不能被进一步分割的最小粒子",而原子操作(atomic operation)意为"不可被中断的一个或一系列操作" .在多处理 ...

  9. 原子操作(atomic operation)

    深入分析Volatile的实现原理 引言 在多线程并发编程中synchronized和Volatile都扮演着重要的角色,Volatile是轻量级的synchronized,它在多处理器开发中保证了共 ...

  10. linux c/c++ 原子操作库 atomic atomic_flag 简介

    目录 简介 1.类classes 1.1 atomic 1)构造函数 2)赋值运算 3)is_lock_free 4)store 5)load 6)operator T 7)exchange 8)co ...

最新文章

  1. php webserver documentroot,PHP $_SERVER['DOCUMENT_ROOT'] 问题
  2. Spring event 使用完全指南
  3. mysql 表分区优缺点_Mysql分区表局限性总结
  4. 【JEECG技术博文】JEECG 简单实例讲解权限控制
  5. metamask插件_Remix+metamask+myetherwallet+Ciper 完成主网发币(实战 十)
  6. 【python学习-2】python起步必备
  7. MSSQL Server 2008 功能
  8. spring是java ee框架吗,Java EE和Spring框架之间的区别
  9. c语言中的符号总结,C语言中的符号总结
  10. 1.STC15W408AS单片机硬件资源
  11. 区块链专利申请量断崖式下降:阿里腾讯跌出十强 网心逆市晋身前四
  12. 更改项目名后出现Could not resolve type id ** into a subtype的报错
  13. linux 验证码 权限,LINUX 下验证码无法显示怎么办
  14. [原创] 原创鼠繪【白发紫衣妖艳男子】
  15. MGR新加节点一直recovering故障解决
  16. 广播计算机应用基础,2019年秋季考试《计算机应用基础》在线考核试题 广播幻灯片操作应选择的功能区是...
  17. 降低网络运维管理成本技巧分析
  18. AYITOJ ROUND #1题解
  19. OPPO 2019校园招聘C/C++开发工程师(手机方向) 笔试编程题-2018.09.10
  20. 机器学习驱动的语言测试

热门文章

  1. HCIE-RS面试----数据帧格式
  2. 有软件测试台式电脑电源供电不足吗,台式机电源供电不足的原因
  3. PPPoE原理和实验
  4. 30 天精通 RxJS(29):30 天感言
  5. Zookeeper学习笔记01
  6. Struts1表单验证方式
  7. VM两个虚拟机之间的通讯测试
  8. mysql 搜索_MySQL模糊搜索的几种姿势
  9. 计算机设备操作与讲解,第五章计算机操作系统设备管理讲解.ppt
  10. Kafka、RabbitMQ、RocketMQ比较