一、前言

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可以避免该问题。

Go并发编程之美-Load/Store操作相关推荐

  1. java并发编程之美-阅读记录1

    1.1什么是线程? 在理解线程之前先要明白什么是进程,因为线程是进程中的一个实体.(线程是不会独立存在的) 进程:是代码在数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,线程则是进程中的 ...

  2. 《Java并发编程之美》

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yAwEsYPZ-1661534116043)(img/\1625573175405.jpg)] [外链图片转存失败,源站 ...

  3. 《Java并发编程之美》阅读笔记

    简介 最近在阅读<Java并发编程之美>这本书,为了督促自己啃完这本书,计划每读完一章写一篇阅读笔记,供以后参考. 笔记列表 第一部分 Java并发编程基础篇 第1章 并发编程线程基础 第 ...

  4. 《Java线程与并发编程实践》—— 1.2 操作更高级的线程任务

    本节书摘来异步社区<Java线程与并发编程实践>一书中的第1章,第1.2节,作者: [美]Jeff Friesen,更多章节内容可以访问云栖社区"异步社区"公众号查看. ...

  5. java并发编程之美-阅读记录11

    java并发编程实践 11.1ArrayBlockingQueue的使用 有关logback异步日志打印中的ArrayBlockingQueue的使用 1.异步日志打印模型概述 在高并发.高流量并且响 ...

  6. java并发编程之美-阅读记录2

    2.1什么是多线程并发编程 并发:是指在同一时间段内,多个任务同时在执行,并且执行没有结束(同一时间段又包括多个单位时间,也就是说一个cpu执行多个任务) 并行:是指在单位时间内多个任务在同时执行(也 ...

  7. java并发编程(十七)内存操作总结

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/17377197 主内存与工作内存 Java内存模型的主要目标是定义程序中各个变量的访问规则, ...

  8. Go并发编程之美(三)、互斥锁

    go并发编程目录 一.前言 go语言类似Java JUC包也提供了一些列用于多线程之间进行同步的措施,比如低级的同步措施有 锁.CAS.原子变量操作类.相比Java来说go提供了独特的基于通道的同步措 ...

  9. Pentium 4处理器架构/微架构/流水线 (11) - NetBurst执行核详解 - Load/Store操作/存储转发

    Loads and Stores Pentium 4处理器采用以下技术来加速访存操作的执行: 投机执行读存操作 对于读存和写存操作,重排序读存操作 允许多个缓存未中共存的情形(即无需等待上一个缓存未中 ...

最新文章

  1. 为什么阿里强制 boolean 类型变量不能使用 is 开头?
  2. Struts2-整理笔记(三)结果处理跳转、获得servletAPI原生
  3. POJ C程序设计进阶 编程题#3:运算符判定
  4. oracle 直接读取文件,oracle直接读取文本文件数据
  5. epoll机制:epoll_create、epoll_ctl、epoll_wait、close
  6. (转)Java atomic原子类的使用方法和原理(一)
  7. 04 循环结构概述和for语句的格式及其使用
  8. gitlab ssh key
  9. 微信公众号H5 - 使用vue开发微信公众号网页
  10. es文件浏览器访问ftp服务器,es文件浏览器如何ftp服务器
  11. matlab白噪音wav,为声音文件添加白噪音
  12. C++使用OLE高速读写EXCEL的源码
  13. 金蝶KIS迷你版标准版备份助手V2.0
  14. 栋的周评 | 第二回合(定期更新、动态、架构、云技术、后端、前端、收听/收看、英文、哲学、书籍、影视、好歌、新奇)
  15. CDH6.3.3 paywall版之前自定义http服务器放置parcels安装数据
  16. LeetCode 1665. 完成所有任务的最少初始能量
  17. JavaSE语法(3)——【逻辑控制:各种分支循环语句】
  18. 小白学Pytorch系列-- Torch API (5)
  19. ERP软件主要的作用有哪些?
  20. 解决重复进入登陆页面问题

热门文章

  1. Shell脚本编写与应用
  2. The Memory Managerment of the Computer
  3. Gartner:2012年大数据HypeCycle
  4. 自适应分辨率可扩展二层JS下拉菜单
  5. Panabit 安装笔记之FreeBsd 6.2的安装
  6. 关于sharepoint
  7. (总结)CentOS 6.x使用yum快速安装Apache+PHP+Tomcat(JSP)+MySQL
  8. 【干货分享】流程DEMO-外出申请
  9. 【linux高级程序设计】(第十五章)UDP网络编程应用 2
  10. Eclipse中SVN的安装步骤(两种)和使用方法[转载]