专栏首页Java编程技术Go并发编程之美-Load/Store操作
原创

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

一、前言

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)操作则可以保证在修改变量的高低位时候其他线程不能读取该变量。

其实前面<<Go并发编程之美-CAS操作>>一文中使用CAS实现的计数器本身还是有问题的:
image.png

其中2.1 old := counter处可能获取脏数据,此处应该修改为

old := atomic.LoadInt32(&counter)

三、总结

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

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 对Java与设计模式态度的转变

    我一直自诩自己是Java一生黑。也从来不屑于设计模式这种东西,因为我一直认为,设计模式是为了解决Java的一些缺陷才存在的。对于Python来说,设计模式并不重...

    青南
  • ABAP文档生成工具

    本文介绍的工具原理和JavaDoc类似,位于software component BBPCRM

    Jerry Wang
  • Java 实现单例模式的 9 种方法

    因进程需要,有时我们只需要某个类同时保留一个对象,不希望有更多对象,此时,我们则应考虑单例模式的设计。

    芋道源码
  • 【漫画】腾讯面试,我竟然输给了final关键字

    任何变量前被 final 修饰就是 final 变量,定义的类前被 final 修饰就是 final 类,任何方法前被 final 修饰就是final方法。

    乔戈里
  • 【BATJ面试必会】JAVA面试到底需要掌握什么?【上】

    秋招几个月累积的知识点,东西太多,分两篇发,尽量用(*)和加粗标注出高频知识点, 都是面试问过的或笔试考过的

    乔戈里
  • 深入理解Java中的String

    想要了解一个类,最好的办法就是看这个类的实现源代码,来看一下String类的源码:

    lyb-geek
  • 面向对象设计的设计模式(四):单例模式

    系统只需要一个实例对象,客户调用类的单个实例只允许使用一个公共访问点,除了该公共访问点,不能通过其他途径访问该实例。比较典型的例子是音乐播放器,日志系统类等等。

    用户2932962
  • 最难学的十大编程语言 Java排第三 它竟是第一名!

    编程语言是开发者们代码工作的核心,也是许多开发者最爱讨论的话题。编程语言的选择对开发者和工具制造商都十分重要,前者需要保持最新和具备市场潜力的技能,后者则亟需确...

    老九君
  • 程序员小技巧之-巧用输入法

    相信你或多或少会遇到一些这样的词语,有些人是直接切换成手写模式搞定的,有些人靠五笔打了出来,其实搜狗拼音输入法早就考虑到这种情况了,为此设计了一种输入法模式——...

    benny
  • 谈一谈Android内存

    或许,因为开发周期的原因;因为自身知识水平的原因;因为经验的原因;又或者是你接了个烂摊子。我们写出了并不太理想的代码,这都是可以接受的,只要你会去持续优化,这些...

    吴延宝

扫码关注云+社区

领取腾讯云代金券