前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Golang实例讲解,数字递增的线程安全性问题

Golang实例讲解,数字递增的线程安全性问题

原创
作者头像
一凡sir
修改于 2023-07-23 01:32:51
修改于 2023-07-23 01:32:51
4780
举报
文章被收录于专栏:技术成长技术成长

先上实例代码,后面再来详细讲解。

代码语言:go
AI代码解释
复制
/**
 * 并发编程,数字递增的线程安全性问题
 */
package main

import (
   "sync"
   "time"
   "fmt"
   "sync/atomic"
)

var data1 int = 0
var data2 *int32
var wgInt sync.WaitGroup = sync.WaitGroup{}

func main() {
   t := int32(0)
   data2 = &t
   max := 100000
   wgInt.Add(max)
   fmt.Printf("data1 add num=%d\n", max)
   time1 := time.Now().UnixNano()
   for i := 0; i < max; i++ {
      go addData1()
   }
   wgInt.Wait()
   time2 := time.Now().UnixNano()
   fmt.Printf("data1=%d, time=%d ms\n", data1, (time2-time1)/1000000)

   wgInt.Add(max)
   fmt.Printf("data2 add num=%d\n", max)
   time3 := time.Now().UnixNano()
   for i := 0; i < max; i++ {
      go addData2()
   }
   wgInt.Wait()
   time4 := time.Now().UnixNano()
   fmt.Printf("data2=%d, time=%d ms\n", *data2, (time4-time3)/1000000)
}
// 简单的+1处理,线程不安全
func addData1() {
   data1++
   wgInt.Done()
}
// 原子性+1处理,线程安全
func addData2() {
   atomic.AddInt32(data2, 1)
   wgInt.Done()
}

实例中定义了两个数字data1, data2,一个是普通的int类型,一个是int32指针,data1用简单的++运算符递增,data2用atomic.AddInt32()方法递增

本地计算机是4核i5处理器,并发运行10w个协程,看到下面的运算结果,和大家预期的一样吗?

代码语言:shell
AI代码解释
复制
data1 add num=100000

data1=98626, time=22 ms

data2 add num=100000

data2=100000, time=26 ms

为什么这么简单的++递增是不安全的呢?

这时,我们就需要深入理解计算机原理了。

++运算符实际上是三个操作,从内存读取data1,cpu更新data1=data1+1,写入data1到内存。

由于我们是多核并行运算的,那么从读取到写入整个过程中,就会出现不同的cpu内核读取到相同的数值,然后更新同样的数值写入到内存,这样就造成++数量比预期的少。

那么atomic.AddInt32()方法又是怎么保证数值递增的安全性呢?

这里就涉及到CAS( Compare and Swap )操作特定的一个复合指令cmpxchg,这个复合指令是现代CPU将上面的3条指令合成为一个指令,由CPU支持的一个复合指令,保证了操作的原子性。

并行运算时数据问题方面,CAS操作没有用互斥锁那么重,而使用的缓存锁的方式,在CPU高速缓存上对缓存行的一致性更新来保证数据更新的一致性

这里只是一个最简单的,单机同进程中,数字递增的并发处理,放大到分布式系统中,这种情况还会更加复杂,比如:如何安全的减少库存。

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

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
关于angularjs下拉框数据回显的问题
使用angular肯定都知道ng的双向数据绑定特性,有像有点废话,但是,今天博主在处理省市下拉框联动数据回显的时候这种特性失效了,同样的下拉框,有的又有用,作为非专业前端博主一脸懵逼,不过,最后用ng-selected还是完美解决了回显的问题,做个记录
kl博主
2023/11/18
3420
前端MVC学习总结(四)——NodeJS+MongoDB+AngularJS+Bootstrap书店示例
摘要总结:本文介绍了如何使用AngularJS04进行图书信息管理系统开发。主要包括了图书信息录入、查询、修改和删除等功能。同时,还提供了编辑图书和删除图书的接口。通过使用AngularJS04的指令和指令模块,可以方便地实现图书信息管理系统。
张果
2018/01/04
2.5K0
前端MVC学习总结(四)——NodeJS+MongoDB+AngularJS+Bootstrap书店示例
AngularJS in Action读书笔记1——扫平一揽子专业术语
前(fei)言(hua):   数月前,以一个盲人摸象的姿态看了一些关于AngularJS的视频书籍,留下了我个人的一点或许是指点迷津或许是误人子弟的读后感。自以为已经达到熟悉ng的程度,但是因为刚入公司,没法直接接触代码层面的编程,日子一天天过去,ng在我脑海的残留也一天天的模糊……   数月后,我重返ng战场,艰难的收集之前留下的记忆碎片,一番拼接下来,没有让我对ng的理解串成一条线,反而支离破碎的片段scope、template、directive、controller、config、factory、
JackieZheng
2018/01/16
1.3K0
AngularJS in Action读书笔记1——扫平一揽子专业术语
AngularJS Bootstrap
AngularJS 的首选样式表是 Twitter Bootstrap, Twitter Bootstrap 是目前最受欢迎的前端框架。
陈不成i
2021/07/26
4.9K0
【AngularJS】—— 2 初识AngularJs(续)
前一篇了解了AngularJS的一些简单的使用,这里继续跟着w3c学习一下剩下的内容。   本篇根据w3cschool.cc继续学习AngularJS剩余的内容,包括:   1 事件   2 模块   3 表单   4 数据验证   5 bootstrap CSS风格   6 include包含其他页面   7 应用程序   8 参考手册   首先看一下html的事件   关于html的事件,文中给出了三个例子,点击、隐藏、显示。使用方法基本相同:   先看一下点击的例子,点击按钮后,会触发ng-clic
用户1154259
2018/01/17
2.5K0
Angularjs基础(八)
AngularJS Bootstrap     AngularJS 的首选样式表是 Twitter Bootstrap ,Twitter Bootstrap 是目前最受欢迎的前端框架 Bootstrap     你可以在你的 AngularJS 应用中加入 Twitter Bootstrap,你可以在你的 <head>元素中添加如下代码:     <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/boo
用户1197315
2018/01/19
3.2K0
jQuery Validate插件实现表单验证
jQuery Validate插件为表单提供了强大的验证功能,让客户端表单验证变得更简单,同时提供可选的定制选项,以满足应用程序各种需求。该插件捆绑了一套有用的验证方法,包括URL和电子邮件验证,同时提供了一个使用编写用户自定义方法的API。所有的捆绑方法替换使用英语作为错误信息,并已翻译成其他37种语言。
别团等shy哥发育
2023/02/25
1.6K0
jQuery Validate插件实现表单验证
Bootstrap【第三章】全局CSS之表单&按钮&图片&辅助类&响应式工具)
class=”form-control”:可以给<input>、<textarea>、<select>元素设置宽度为100%
用户10196776
2022/11/22
1.4K0
AngularJS in Action读书笔记4(实战篇)——创建Statistic模块
  个人感觉《Angularjs in action》这本书写的很好,很流畅,循序渐进,深入浅出,关键是结合了一个托管于Github上的实例讲解的,有代码可查,对于初学者应该是个不错的途径。(不是打广告)其实书早已经看完一遍,脑瓜子里面已经存储了一些module、controller、directive、scope等等这些概念,但是怎么把这些东西串起来,用起来,不动手,还是不能检验看书的效果。所以从这篇就来结合自己的实操经验来分享下自己是如何消化(囫囵吞枣)这些概念和设计理念的。   设计初衷是要在原来的A
JackieZheng
2018/01/16
8610
AngularJS in Action读书笔记4(实战篇)——创建Statistic模块
Bootstrap3【上手教程】
目录 一、思维导图 二、表单【代码有注解】 三、按钮【代码有注解】 四、图片【代码有注解】 图片形状有三种: 圆角矩形: 圆形/椭圆: 这个比较牛逼,会根据图片来决定是宽椭圆还是高椭圆。 缩略图: 五、辅助类【代码有注解】 ---- 一、思维导图 二、表单【代码有注解】 之前我们写在文本框前面写用户名 一直都是直接写字,在实际开发中一般用文本标签包起来例如 <label> <span> 标签,我们可以看到效果文本框的宽度占满了整行,下拉框的宽度也占满了整行 <!-- 1.1.基本表单 --
天蝎座的程序媛
2022/11/18
4700
Bootstrap3【上手教程】
博科趣二维码在线生成网页源码
二维码在线生成网页源码是一种基于特定编码规则,能够将各种数据转化为可被手机扫描识别的图形化代码。这种源码通常包含HTML、CSS和JavaScript等技术,用于在网页上实现二维码的动态生成与显示功能。在当今信息化社会,二维码被广泛应用在广告宣传、链接分享、支付凭证等多个领域 http://www.bokequ.com/api/qrcode/
博客趣
2024/02/15
2810
博科趣二维码在线生成网页源码
Web开发---单页面应用(签到日报--技术实现)
疫情前期,员工分布在各个地区,需要上报个人的健康状态和位置信息,于是做了一个单页面应用(当时钉钉和微信上的健康上报模板还没出现)
MiaoGIS
2020/03/16
8620
Web开发---单页面应用(签到日报--技术实现)
03_Bootstrap基础组件03
设置了 .form-control 类的表单元素,默认设置宽度属性为 width: 100%;。将 label 元素和表单元素包裹在 .form-group 中可以按照排好的样式进行展示。
张哥编程
2024/12/13
890
angularjs 表单验证
一、常用的表单验证指令  1. 必填项验证 某个表单输入是否已填写,只要在输入字段元素上添加HTML5标记required即可: <input type="text" required />   2. 最小长度 验证表单输入的文本长度是否大于某个最小值,在输入字段上使用指令ng-minleng= "{number}": <input type="text" ng-minlength="5" /> 3. 最大长度 验证表单输入的文本长度是否小于或等于某个最大值,在输入字段上使用指令ng-maxlength=
柴小智
2018/04/10
7.1K0
angularjs 表单验证
Angular 从入坑到挖坑 - 表单控件概览
angular 入坑记录的笔记第三篇,介绍 angular 中表单控件的相关概念,了解如何在 angular 中创建一个表单,以及如何针对表单控件进行数据校验。
程序员宇说
2020/03/19
20.1K0
PHP实现用户登录注册功能
初学php做了一些比较常见且有用的页面,放在上面记录一下咯 我是用了bootstrap框架里面的模态框做注册登陆页面,这样页面比较美观 页面效果:
用户8099761
2023/05/11
2.1K0
PHP实现用户登录注册功能
【原创】bootstrap框架的学习 第八课 -[bootstrap表单]
<!DOCTYPE html> <html> <head> <title>Bootstrap 实例 - 内联表单</title> <link href="http://libs.baidu.com/bootstrap/3.0.3/css/bootstrap.min.css" rel="stylesheet"> <script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script> <script src="http://libs.baidu.com/bootstrap/3.0.3/js/bootstrap.min.js"></script> </head> <body>
用户3055976
2018/09/12
1.5K0
【原创】bootstrap框架的学习 第八课 -[bootstrap表单]
AngularJS基础入门初探
  (2)由Misko Hevery 等人创建,2009年被Google所收购,用于其多款产品
Edison Zhou
2018/08/20
2K0
AngularJS基础入门初探
BootStrap应用开发学习入门
[TOC] 0x00 前言简介 什么是BootStrap? 答:Bootstrap是Twitter 的 Mark Otto 和 Jacob Thornton 开发的推出的一个用于前端开发的开源工具包产
全栈工程师修炼指南
2020/10/23
18.4K0
BootStrap应用开发学习入门
进云-[PC组件]-商品展示组件--示例
1、展示代码 //注意:ng-init="get_data(pagedata.extradata,'goods','jy_weishop/goods.get_goods//num='+{item}.params.num)" //这个是页面获取数据的方法;第三个参数是要获取数据的页面路径,注意,这里是管理端展示的代码,这个路径必须的管理端的页面路径 //读取数据pagedata.extradata.goods,这里由于传过来的是在list里面,商品数据就是:pagedata.extradata.goods.
用户2615381
2022/04/15
8610
相关推荐
关于angularjs下拉框数据回显的问题
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档