Go并发编程(六)atomic包
2021/5/2 1:25:16
本文主要是介绍Go并发编程(六)atomic包,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
文章目录
- Go并发编程(六)atomic包
- 使用
- CAS
- swap
- 原理
Go并发编程(六)atomic包
代码中的加锁操作因为涉及内核态的上下文切换会比较耗时、代价比较高。针对基本数据类型我们还可以使用原子操作来保证并发安全,因为原子操作是Go语言提供的方法它在用户态就可以完成,因此性能比加锁操作更好。Go语言中原子操作由内置的标准库sync/atomic提供。
使用
func TestMyAtomic() { // 写入 var a int64 atomic.StoreInt64(&a,10) fmt.Println("写入a:",a) // 修改 atomic.AddInt64(&a,1) // 读取 b := atomic.LoadInt64(&a) fmt.Println("读取a:",b) // 交换,非cas,直接赋予新值 old := atomic.SwapInt64(&a,b) fmt.Println("交换后旧值:",old) fmt.Println("新值:",atomic.LoadInt64(&a)) // 比较并交换,只有跟期望值相等才会交换 flag := atomic.CompareAndSwapInt64(&a,10,10) fmt.Println("比较并交换:",flag) }
CAS
Compare And Swap 简称CAS,在sync/atomic包种,这类原子操作由名称以‘CompareAndSwap’为前缀的若干个函数代表。
声明如下
func CompareAndSwapInt32(addr *int32, old, new int32) (swapped bool)
- 调用函数后,会先判断参数addr指向的被操作值与参数old的值是否相等
- 仅当此判断得到肯定的结果之后,才会用参数new代表的新值替换掉原先的旧值,否则操作就会被忽略。
swap
交换Swap
与CAS操作不同,原子交换操作不会关心被操作的旧值。
它会直接设置新值
它会返回被操作值的旧值
此类操作比CAS操作的约束更少,同时又比原子载入操作的功能更强
原理
如何保证原子性?
atomic包将底层提供的原子内存操作封装为go函数
这篇关于Go并发编程(六)atomic包的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-20MongoDB教程:从入门到实践详解
- 2024-11-17执行 Google Ads API 查询后返回的是空数组什么原因?-icode9专业技术文章分享
- 2024-11-17google广告数据不同经理账户下的凭证可以获取对方的api数据吗?-icode9专业技术文章分享
- 2024-11-15SendGrid 的 Go 客户端库怎么实现同时向多个邮箱发送邮件?-icode9专业技术文章分享
- 2024-11-15SendGrid 的 Go 客户端库怎么设置header 和 标签tag 呢?-icode9专业技术文章分享
- 2024-11-12Cargo deny安装指路
- 2024-11-02MongoDB项目实战:从入门到初级应用
- 2024-11-01随时随地一键转录,Google Cloud 新模型 Chirp 2 让语音识别更上一层楼
- 2024-10-25Google Cloud动手实验详解:如何在Cloud Run上开发无服务器应用
- 2024-10-24AI ?先驱齐聚 BAAI 2024,发布大规模语言、多模态、具身、生物计算以及 FlagOpen 2.0 等 AI 模型创新成果。