通常使用互斥锁(Mutex)这一数据结构来保证每次只有一个 Go 程能够访问一个共享的变量

sync.Mutex:

Go 标准库中提供了 sync.Mutex 互斥锁类型及其两个方法:

Lock()

Unlock()

我们可以通过在代码前调用Lock方法,在代码后调用Unlock方法来保证一段代码的互斥执行

用defer语句来保证互斥锁一定会被解锁

// SafeCounter 的并发使用是安全的。
type SafeCounter struct {v map[string]intmux sync.Mutex
}
​
// Inc 增加给定 key 的计数器的值。
func (c *SafeCounter) Inc(key string) {c.mux.Lock()// Lock 之后同一时刻只有一个 goroutine 能访问 c.vc.v[key]++c.mux.Unlock()
}
​
// Value 返回给定 key 的计数器的当前值。
func (c *SafeCounter) Value(key string) int {c.mux.Lock()// Lock 之后同一时刻只有一个 goroutine 能访问 c.v
 defer c.mux.Unlock()return c.v[key]
}
​
func main() {c := SafeCounter{v: make(map[string]int)}for i := 0; i < 1000; i++ {go c.Inc("somekey")}
​time.Sleep(time.Second)fmt.Println(c.Value("somekey"))
}

运行结果:

1000

所有资料与参考来源:

Go语言入门教程:http://c.biancheng.net/golang/

Go指南:https://tour.go-zh.org/list

转载于:https://www.cnblogs.com/VingB2by/p/11119886.html

从零开始学Go之并发(四):互斥相关推荐

  1. python画circos图_从零开始学CIRCOS绘制圈图(四)

    从零开始学CIRCOS绘制圈图(一) 从零开始学CIRCOS绘制圈图(二) 从零开始学CIRCOS绘制圈图(三) 通常circos的中间部分不是空白区域,会用一条条线进行连接,表示两个染色体部分区域有 ...

  2. 【从零开始学Mask RCNN】四,RPN锚框生成和Proposal生成

    1. Mask RCNN Anchor框 生成 Mask RCNN的锚框生成和SSD的锚框生成策略类似(SSD的锚框生成策略见:[资源分享]从零开始学习SSD教程) ,都遵循以下规则: Anchor的 ...

  3. C语言学习——从零开始学编程(第四篇:函数)

    目录 前言--小颖的话 一.函数的概念 二.C语言中函数的分类 1.库函数 1.自定义函数 1)函数名 2)函数返回值 3)函数参数 4)实现几个简单函数 三.函数的形参与实参 1.实际参数 2.形式 ...

  4. 从零开始学ESP32:(四)ESP32/freeRTOS 实现一个内存池操作

    零开始学ESP32:个人笔记记录: 芯片型号: ESP32 网络环境支持:LWIP IDF.PY-SDK: ESP-IDF v4.3 芯片功能: freeRTOS系统 声明: 当前内存池参考 Linu ...

  5. 从零开始学_JavaScript_系列(四)——jquery(基础,选择器,触发条件,动画,回调函数)...

    jQuery语法 (1)引用jquery文件及下载库: http://jquery.com/download/ 下载 Download the compressed, production jQuer ...

  6. 从零开始学Pytorch(十四)之优化算法进阶

    动量 目标函数有关自变量的梯度代表了目标函数在自变量当前位置下降最快的方向.因此,梯度下降也叫作最陡下降(steepest descent).在每次迭代中,梯度下降根据自变量当前位置,沿着当前位置的梯 ...

  7. 从零开始学androidTextView的使用.四.

    基本的图形组件View No. 组件名称 描述 1 TextView 表示一个文本的显示组件 2 Button 表示一个普通的按钮 3 EditText 表示一个可编辑的文本框组件 4 CheckBo ...

  8. 从零开始学 Web 系列教程

    大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新-- github:https://github.com/Daotin/Web 微信公众号:前端队长 博客园:http://ww ...

  9. 从零开始学JAVA:二、Java基本语法(四)——流程控制

    从零开始学JAVA:二.Java基本语法(四)--流程控制 程序流程控制 1.顺序结构 2.分支结构 2.1.if-else结构 2.2.switch-case选择结构 2.3.Scanner类的使用 ...

最新文章

  1. micropython比c_选择C/C++还是选择MicroPython来开发?(第0章-第三节)
  2. python代码块使用缩进表示-Python 为什么使用缩进来划分代码块?
  3. 【快乐水题】1725. 可以形成最大正方形的矩形数目
  4. matlab仿真生成信号程序,信号与系统的MATLAB仿真
  5. [BZOJ2502]清理雪道解题报告|带下界的最小流
  6. iOS XMPP Framework 中文概述
  7. 工作中的javascript代码收集及整理
  8. jquery-jquery对向与dom标签对向
  9. 《实践与思考》系列连载(6)——IT从业人员工作环境及状态调查 抽奖结果公布...
  10. java简单数据类型的知识点
  11. MySQL数据类型 int(M) 表示什么意思?详解mysql int类型的长度值问题
  12. WPF的prism框架
  13. Excel两行交换及两列交换,快速互换相邻表格数据的方法
  14. cdb.exe的利用
  15. 【数据分析】滴滴数据分析岗实习经验
  16. 基于决策树的电网负荷预测
  17. 题目描述:设有一头小母牛,从出生第四年起每年生一头小母牛,按此规律,第N年时有几头母牛?
  18. 世界上第一台超越早期经典计算机的光量子计算机诞生,世界上第一台超越早期经典计算机的光量子计算机诞生!是货真价实的“中国造”...
  19. Google收购GIPS
  20. c语言编程求macd最大值,2010年天津工业大学耀华杯计算机竞赛试卷(C语言全卷带答案).doc...

热门文章

  1. CF1062E Company
  2. java Servlet Session
  3. 博客园山寨版(asp.net mvc 开源)
  4. c#调用c++ delegate callback
  5. c# 去除字符串中的换行符 \r\n
  6. 从零开始学C++之运算符重载(三):完善String类([]、 +、 += 运算符重载)、和运算符重载...
  7. hibernate---id生成策略
  8. 获取存储过程返回值及代码中获取返回值(转)
  9. 揭秘基于MBSE集成化的汽车电子解决方案
  10. MySQL裸机性能测试(2021)