go语言提供的原子操作都是非侵入式的,它们由标准库代码包sync/atomic中的众多函数代表。

   我们调用sync/atomic中的几个函数可以对几种简单的类型进行原子操作。这些类型包括int32,int64,uint32,uint64,uintptr,unsafe.Pointer,共6个。这些函数的原子操作共有5种:增或减,比较并交换、载入、存储和交换它们提供了不同的功能,切使用的场景也有区别。

增或减

   顾名思义,原子增或减即可实现对被操作值的增大或减少。因此该操作只能操作数值类型。

   被用于进行增或减的原子操作都是以“Add”为前缀,并后面跟针对具体类型的名称。

//方法源码
func AddUint32(addr *uint32, delta uint32) (new uint32)

增加

示例:(在原来的基础上加n)

atomic.AddUint32(&addr,n)

示例:(在原来的基础上加n(n为负数))

atomic.AddUint32(*addr,uint32(int32(n)))
//或
atomic.AddUint32(&addr,^uint32(-n-1))

比较并交换

   比较并交换----Compare And Swap 简称CAS

   他是假设被操作的值未曾被改变(即与旧值相等),并一旦确定这个假设的真实性就立即进行值替换

   如果想安全的并发一些类型的值,我们总是应该优先使用CAS

//方法源码
func CompareAndSwapInt32(addr *int32, old, new int32) (swapped bool)

示例:(如果addr和old相同,就用new代替addr)

ok:=atomic.CompareAndSwapInt32(&addr,old,new)

载入

   如果一个写操作未完成,有一个读操作就已经发生了,这样读操作使很糟糕的。

   为了原子的读取某个值sync/atomic代码包同样为我们提供了一系列的函数。这些函数都以"Load"为前缀,意为载入。

//方法源码
func LoadInt32(addr *int32) (val int32)

示例

fun addValue(delta int32){for{v:=atomic.LoadInt32(&addr)if atomic.CompareAndSwapInt32(&v,addr,(delta+v)){break;}}
}

存储

   与读操作对应的是写入操作,sync/atomic也提供了与原子的值载入函数相对应的原子的值存储函数。这些函数的名称均以“Store”为前缀

   在原子的存储某个值的过程中,任何cpu都不会进行针对进行同一个值的读或写操作。如果我们把所有针对此值的写操作都改为原子操作,那么就不会出现针对此值的读操作读操作因被并发的进行而读到修改了一半的情况。

   原子操作总会成功,因为他不必关心被操作值的旧值是什么。

//方法源码
func StoreInt32(addr *int32, val int32)

示例

atomic.StoreInt32(被操作值的指针,新值)
atomic.StoreInt32(&value,newaddr)

交换

   原子交换操作,这类函数的名称都以“Swap”为前缀。

   与CAS不同,交换操作直接赋予新值,不管旧值。

   会返回旧值

//方法源码
func SwapInt32(addr *int32, new int32) (old int32)

示例

atomic.SwapInt32(被操作值的指针,新值)(返回旧值)
oldval:=atomic.StoreInt32(&value,newaddr)

go 原子操作 atomic的使用相关推荐

  1. Java原子操作Atomic

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/120854796 本文出自[赵彦军的博客] Java线程安全StampedLock ...

  2. 什么是Java中的原子操作( atomic operations)

    1.啥是java的原子性 原子性:即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行. 一个很经典的例子就是银行账户转账问题: 比如从账户A向账户B转1000元,那么 ...

  3. go 原子操作 atomic

    1. 什么是原子操作 我们已经知道,原子操作即是进行过程中不能被中断的操作.也就是说,针对某个值的原子操作在被进行的过程当中,CPU绝不会再去进行其它的针对该值的操作.无论这些其它的操作是否为原子操作 ...

  4. C++原子操作 atomic的使用及效率

    1. 概述 原子操作,它表示在多个线程访问同一个全局资源的时候,能够确保所有其他线程都不在同一时间访问该资源.也就是确保了在同一时刻只有一个线程对这个资源进行访问.这有点类似互斥对象对共享资源的访问的 ...

  5. 原子操作Atomic类

    文章目录 一.Synchronized的弊端 二.原子操作类 Atomic 2.1 CAS 机制 2.2 CAS 底层原理 2.3 ABA 问题 一.Synchronized的弊端 同步锁Synchr ...

  6. C++11并发编程:原子操作atomic

    一:概述 项目中经常用遇到多线程操作共享数据问题,常用的处理方式是对共享数据进行加锁,如果多线程操作共享变量也同样采用这种方式. 为什么要对共享变量加锁或使用原子操作?如两个线程操作同一变量过程中,一 ...

  7. 原子操作-atomic

    文章目录 一.原子操作(可以实现无锁队列) 二.原子操作demo 一.原子操作(可以实现无锁队列)   所谓的原子操作,取的就是"原子是最小的.不可分割的最小个体"的意义,它表示在 ...

  8. C++ 原子操作 atomic 的一些思考

    在学习原子操作后,少有使用过,遗忘了不少,并还是有很多不了解的地方.比如,最近突然冒出的问题: std::atomic在赋值.比较过程中,是原子操作吗? 为了验证结果,这里写了一个demo用来验证a ...

  9. 原子操作(atomic operation)

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

最新文章

  1. solr配置-Schema.xml
  2. node中怎样将css导入到html,CSS无法使用Node.js加载到我的HTML代码中
  3. Linux文件索引节点相关概念
  4. UA MATH523A 实分析3 积分理论例题 Fubini定理计算重积分的极限
  5. c++ #define
  6. spring源码分析之定时任务概述
  7. jquery滚动条到底部触发事件
  8. eclipse开发java程序,断点调试
  9. OSS在线迁移服务剖析
  10. 虚拟机python环境搭载_windows之自动化在虚拟机部署操作系统并自带python环境
  11. ES和Kibana在docker中的安装
  12. SQL Server 2005 允许远程连接解配置
  13. java swing有趣编程_java(swing编程)如何这个简单效果?
  14. 51 单片机学习_2.1 独立按键控制LED亮灭
  15. YoC RTOS 实战:FOTA系统升级
  16. windows无法格式化u盘_u盘无法格式化的解决教程 好东西,以后优盘不怕坏了
  17. 可自定义存储数据总空间的的类int_128函数库
  18. 文件夹右击一直转圈圈
  19. AutoCAD.NET API2018二次开发第二十章
  20. 李子柒——成功的网络视频制作人及其营销分析

热门文章

  1. 在服务器生成ssl认证
  2. 洛谷 - P5192 Zoj3229 Shoot the Bullet|东方文花帖|【模板】有源汇上下界最大流(有源汇有上下界的最大流)
  3. POJ - 1185 炮兵阵地(状压dp)
  4. java plt_matplotlib 画动态图以及plt.ion()和plt.ioff()的使用详解
  5. 25.智能指针.rs
  6. 关于windows xp sp2/sp3 中tcpip.sys对于Raw socket的限制
  7. c++ template笔记(1)模板函数
  8. 非常精确的测试运行时间(比clock()更精确些)
  9. 几个预编译指令的用法
  10. Jenkins 在 Tomcat 中的部署及代码静态检查工具集成