美文网首页程序员技术栈go并发编程
Go并发编程之美-Load/Store操作

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

作者: 阿里加多 | 来源:发表于2019-02-15 19:07 被阅读15次

一、前言

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

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

image.png
其中2.1 old := counter处可能获取脏数据,此处应该修改为
old := atomic.LoadInt32(&counter)

三、总结

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

相关文章

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

    一、前言 go语言类似Java JUC包也提供了一些列用于多线程之间进行同步的措施,比如低级的同步措施有 锁、CA...

  • Go并发编程之美-CAS操作

    一、前言 go语言类似Java JUC包也提供了一些列用于多线程之间进行同步的措施,比如低级的同步措施有 锁、CA...

  • Go并发编程之美-CAS操作

    摘要:一、前言 go语言类似Java JUC包也提供了一些列用于多线程之间进行同步的措施,比如低级的同步措施有 锁...

  • go并发编程之美(一)

    一、前言 在Java中多线程之间是通过共享内存进行通信的,在go中多线程之间通信是基于消息的,go中的通道是go中...

  • Go语言并发

    Go语言并发 Go语言级别支持协程,叫做goroutine Go 语言从语言层面支持并发和并行的开发操作 Go并发...

  • GO学习笔记(18) - 并发编程(3)- Select与Cha

    本文主要讲解Go并发编程之Select 目录 介绍 基础语法 timeout 综合实例 select 是 Go 中...

  • 并发编程之美-终章chat

    一、Java 并发编程之美:并发编程高级篇之五 微信扫码二维码加入本 Chat 作为 Java 并发编程之美系列的...

  • Go并发编程之美-互斥锁

    一、前言 go语言类似Java JUC包也提供了一些列用于多线程之间进行同步的措施,比如低级的同步措施有 锁、CA...

  • Go并发编程之美-读写锁

    一、前言 go语言类似Java JUC包也提供了一些列用于多线程之间进行同步的措施,比如低级的同步措施有 锁、CA...

  • Go并发编程之美-条件变量

    一、前言 go语言类似Java JUC包也提供了一些列用于多线程之间进行同步的措施,比如低级的同步措施有 锁、CA...

网友评论

    本文标题:Go并发编程之美-Load/Store操作

    本文链接:https://www.haomeiwen.com/subject/gidleqtx.html