• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Go并发编程之美-Load/Store操作

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

一、前言

go语言类似Java JUC包也提供了一些列用于多线程之间进行同步的措施,比如低级的同步措施有 锁、CAS、原子变量操作类。相比Java来说go提供了独特的基于通道的同步措施。本节我们先来看看go中Load/Store操作

二、Load/Store操作

go中的Load和Store提供了原子性的读取和修改变量的功能,那么什么是原子性那?比如int64 类型的变量M,在字节长为32的计算机中,读取该变量M需要两次读取(比如先读取高32位,然后在读取底32位),写入的时候也是一样。正常情况下读取变量M的时候并没有加什么额外的措施,多个线程可以同时读写该变量的高32和底32位。

比如线程A读取变量M的高32时候,线程B在修改变量M的低32位,那么就会造成线程A读取的变量的M的高32位是原来的值,低32位是线程B修改后的值,从而导致脏数据,程序出错。

go中的atomic.LoadInt64(&M)操作可以保证在读取变量M的时候,其他线程不能修改变量M, atomic.StoreInt64(&M, val)操作则可以保证在修改变量的高低位时候其他线程不能读取该变量。

其实前面<>一文中使用CAS实现的计数器本身还是有问题的:
其中2.1 old := counter处可能获取脏数据,此处应该修改为
old := atomic.LoadInt32(&counter)

三、总结

go中的Load和Store操作提供了对变量原子性的操作,可以避免当类型长度大于计算机字节长时候多线程读写变量造成数据混乱,在java中变量声明为volatile可以避免该问题。


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Go-循环发布时间:2022-07-10
下一篇:
go语言编写同时支持Linux和Windows的单文件Web界面文件浏览器filebrowser介绍 ...发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap