原子操作--sync/atomic的用法
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 = 10
atomic.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)
}
上面的代码有几个点需要注意:
- 传递给atomic.AddUint32函数的必须是指针类型。同理,unsafe.Pointer也是如此
- 对于atomic.AddUint64函数做原子减法,有两种方法,具体看代码
sync/atomic 比较并交换操作与交换操作的异同:
- 比较并交换操作即CAS操作,是有条件的交换操作,只有在条件满足的情况下才会进行值的交换
func main() {
var a int32 = 0
go func() {
for {
fmt.Println(a)
// 当a == 10,就设置 a=0,并返回ture
if 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可以存入的值
原子操作--sync/atomic的用法的更多相关文章
- golang sync/atomic
刚刚学习golang原子操作处理的时候发现github上面一个比较不错的golang学习项目 附上链接:https://github.com/polaris1119/The-Golang-Standa ...
- 原子操作(atomic operation)
深入分析Volatile的实现原理 引言 在多线程并发编程中synchronized和Volatile都扮演着重要的角色,Volatile是轻量级的synchronized,它在多处理器开发中保证了共 ...
- golang语言中sync/atomic包的学习与使用
package main; import ( "sync/atomic" "fmt" "sync" ) //atomic包提供了底层的原子级 ...
- Java 并发系列之九:java 原子操作类Atomic(13个)
1. 原子更新基本类型类 2. 原子更新数组 3. 原子更新引用 4. 原子更新属性 5. txt java 原子操作类Atomic 概述 java.util.concurrent.atomic里的原 ...
- java架构之路(多线程)原子操作,Atomic与Unsafe魔术类
这次不讲原理了,主要是一些应用方面的知识,和上几次的JUC并发编程的知识点更容易理解. 知识回顾: 上次主要说了Semaphore信号量的使用,就是一个票据的使用,我们举例了看3D电影拿3D眼镜的例子 ...
- 探究Java如何实现原子操作(atomic operation)
1. 让我们首先了解下java 中 Volatile 关键字 Volatile可实现java内存模型当中的可见性, java内存模型的可见性: 可见性,是指线程之间的可见性,一个线程修改的状态对另一个 ...
- C++11中的原子操作(atomic operation)
所谓的原子操作,取的就是“原子是最小的.不可分割的最小个体”的意义,它表示在多个线程访问同一个全局资源的时候,能够确保所有其他的线程都不在同一时间内访问相同的资源.也就是他确保了在同一时刻只有唯一的线 ...
- C++11中的原子操作(atomic operation)(转)
所谓的原子操作,取的就是“原子是最小的.不可分割的最小个体”的意义,它表示在多个线程访问同一个全局资源的时候,能够确保所有其他的线程都不在同一时间内访问相同的资源.也就是他确保了在同一时刻只有唯一的线 ...
- [Go] sync.Once 的用法
sync.Once.Do(f func()) 是一个非常有意思的东西,能保证 once 只执行一次,无论你是否更换 once.Do(xx) 这里的方法,这个 sync.Once块 只会执行一次. pa ...
随机推荐
- 3.The significance of Books 书本的意义
3.The significance of Books 书本的意义 (1)A bookless life is an imcomplete life.Books influence the depth ...
- python知识积累
1. 安装requirements.txt依赖: pip install -r requirements.txt 生成requirements.txt文件: pip freeze > requi ...
- 启动tomcat报错Caused by: java.io.FileNotFoundException: class path resource [io/renren/controller/NodeDataController] cannot be opened because it does not exist
?? 清理项目,再重启服务就好了.........
- How to fix "FAILURE DURING CONVERSION TO COFF: FILE INVALID OR CORRUPT"
Error LINK : fatal error LNK1123: failure during conversion to COFF: file invalid or corrupt appear ...
- 线段树区间覆盖 蛤玮打扫教室(zzuli 1877)
http://acm.zzuli.edu.cn/zzuliacm/problem.php?id=1877 Description 现在知道一共有n个机房,算上蛤玮一共有m个队员,教练做了m个签,每 ...
- Android 百度云推送
http://developer.baidu.com/wiki/index.php?title=docs/cplat/push/sdk/clientsdk. public class DemoAppl ...
- Lib作为“静态库”与“动态库”中的区别
Lib作为“静态库”与“动态库”中的区别 0. 前言: 什么是静态连接库: 静态库在链接阶段,会将汇编生成的目标文件.o与引用到的库一起链接打包到可执行文件中.因此对应的链接方式称为静态链接. 为什么 ...
- 两个jsp文件运行后弹出对话框 下载文件问题
这个问题是两个jsp字符编码不一致的问题 如图所示 划线部分是要特别注意的地方 出错往往是这里 有时是“;”后面有无空格 如果login.jsp有 那么loginCheck.jsp也必须要有而且是同样 ...
- Android-Java-synchronized静态方法&字节码文件对象
上一篇博客 Android-Java-同步方法-synchronized,中讲解了普通方法加入synchronized修饰符,此synchronized的同步锁是this,还介绍方法的封装性,这篇博客 ...
- ASP.NET Core开源地址
https://github.com/dotnet/corefx 这个是.net core的 开源项目地址 https://github.com/aspnet 这个下面是asp.net core 框架 ...