代码演示:

package main

import (
"fmt"
"math/rand"
"runtime"
"sync"
"sync/atomic"
"time"
) func main() {
var state = make(map[int]int)
var mutex = &sync.Mutex{}
var ops int64 = 0 for r := 0; r < 100; r++ {
go func() {
total := 0
for {
key := rand.Intn(5) + 1
mutex.Lock()
total += state[key]
mutex.Unlock()
atomic.AddInt64(&ops, 1)
runtime.Gosched()
}
}()
}
for w := 0; w < 10; w++ {
go func() {
for {
key := rand.Intn(5) + 1
val := rand.Intn(100) + 1
mutex.Lock()
state[key] = val
mutex.Unlock()
atomic.AddInt64(&ops, 1)
runtime.Gosched()
}
}()
}
time.Sleep(time.Second)
opsFinal := atomic.LoadInt64(&ops)
fmt.Println("ops:", opsFinal)
mutex.Lock()
fmt.Println("state:", state)
mutex.Unlock()
}

  

代码运行结果:

ops: 4728620
state: map[5:4 2:90 4:16 3:84 1:77]

  

代码解读:

  • 互斥锁用来使go协程间访问数据更加安全,当一个数据上锁之后,其它人就无法就该数据进行操作,一直到解锁后
  • 以上例子中,我们对state这个map进行了读写操作,并在读写过程中运用互斥锁
  • 本例中创建了一个读的函数和一个写的函数,均运用了互斥锁
  • 最终打印state时候,也上了锁,这是因为,有可能协程还没有读写完state,上锁为了安全的输出结果

037_go语言中的互斥锁的更多相关文章

  1. 006_go语言中的互斥锁的作用练习与思考

    在go语言基本知识点中,我练习了一下互斥锁,感觉还是有点懵逼状,接下来为了弄懂,我再次进行了一些尝试,以下就是经过我的尝试后得出的互斥锁的作用. 首先还是奉上我改造后的代码: package main ...

  2. Go语言中的互斥锁和读写锁(Mutex和RWMutex)

    目录 一.Mutex(互斥锁) 不加锁示例 加锁示例 二.RWMutex(读写锁) 并发读示例 并发读写示例 三.死锁场景 1.Lock/Unlock不是成对出现 2.锁被拷贝使用 3.循环等待 虽然 ...

  3. java中的互斥锁和信号量的区别

    互斥锁和信号量都是操作系统中为并发编程设计基本概念,互斥锁和信号量的概念上的不同在于,对于同一个资源,互斥锁只有0和1 的概念,而信号量不止于此.也就是说,信号量可以使资源同时被多个线程访问,而互斥锁 ...

  4. 线程私有数据TSD——一键多值技术,线程同步中的互斥锁和条件变量

    一:线程私有数据: 线程是轻量级进程,进程在fork()之后,子进程不继承父进程的锁和警告,别的基本上都会继承,而vfork()与fork()不同的地方在于vfork()之后的进程会共享父进程的地址空 ...

  5. 【Golang详解】go语言中并发安全和锁

    go语言中并发安全和锁 首先可以先看看这篇文章,对锁有些了解 [锁]详解区分 互斥锁.⾃旋锁.读写锁.乐观锁.悲观锁 Mutex-互斥锁 Mutex 的实现主要借助了 CAS 指令 + 自旋 + 信号 ...

  6. Go 互斥锁(sync.Mutex)和 读写锁(sync.RWMutex)

    什么时候需要用到锁? 当程序中就一个线程的时候,是不需要加锁的,但是通常实际的代码不会只是单线程,所以这个时候就需要用到锁了,那么关于锁的使用场景主要涉及到哪些呢? 多个线程在读相同的数据时 多个线程 ...

  7. Java并发编程实战(3)- 互斥锁

    我们在这篇文章中主要讨论如何使用互斥锁来解决并发编程中的原子性问题. 目录 概述 互斥锁模型 互斥锁简易模型 互斥锁改进模型 Java世界中的互斥锁 synchronized中的锁和锁对象 synch ...

  8. ucos实时操作系统学习笔记——任务间通信(互斥锁)

    想讲一下ucos任务间通信中的mutex,感觉其设计挺巧妙,同sem一样使用的是event机制实现的,代码不每一行都分析,因为讲的没邵贝贝老师清楚,主要讲一下mutex的内核是如何实现的.可以理解互斥 ...

  9. linux c学习笔记----互斥锁属性

    转自:http://lobert.iteye.com/blog/1762844 互斥锁属性 使用互斥锁(互斥)可以使线程按顺序执行.通常,互斥锁通过确保一次只有一个线程执行代码的临界段来同步多个线程. ...

随机推荐

  1. CSS(二)- 选择器 - 伪元素和伪类(思维导图)

    伪元素 伪元素可以创建一些文档语言无法创建的虚拟元素.比如:文档语言没有一种机制可以描述元素内容的第一个字母或第一行,但伪元素可以做到(::first-letter.::first-line).同时, ...

  2. EM算法的收敛性

    https://blog.csdn.net/kevinoop/article/details/80522477

  3. 数据可视化之powerBI技巧(十六)采悟:PowerBI作图技巧:动态显示可视化标题

    默认情况下,PowerBI图表的标题是静态的,为了增强图表的可读性,通过设置动态标题,可快速展示关键信息.提升沟通效率.本文通过两个简单的例子来看看PowerBI中如何创建动态标题. /01/ 拿之前 ...

  4. 数据可视化之PowerQuery篇(十八)Power BI数据分析应用:结构百分比分析法

    ​https://zhuanlan.zhihu.com/p/113113765 本文为星球嘉宾"海艳"的PowerBI数据分析工作实践系列分享之二,她深入浅出的介绍了PowerBI ...

  5. Git管理修改、撤销和删除文件

    目录 备注: 知识点 管理修改 撤销修改 没有git add添加到暂存区时的撤销 git add添加到暂存区后的撤销 git commit提交后的撤销 删除文件 确定从版本库中删除文件 从暂存区把误删 ...

  6. 用Canvas定时显示摄像头捕获的画像(HTML5)

    需要实现一个功能,大意嘛,就是标题写的那个意思.虽然用户只要求在微信中实现即可,也就是可以用JSSDK.但是前端小哥哥脑袋一根筋,就想用原生的H5和JS实现. 网上铺天盖地的资料,可惜没有一个是可以用 ...

  7. linux 安装 mysql8

    1. 下载地址: https://dev.mysql.com/downloads/file/?id=484922 2. 安装 mysql80-community-release-el7-3.noarc ...

  8. Unity3D Demo项目开发记录

    前言 经过一段时间的学习与实际开发,unity3D也勉强算是强行入门了,正所谓好记性不如烂笔头,更何况本人并非专业从事unity3D开发,会一点C#但也并不熟悉,为了避免后期遗忘,因此特意整理了一个D ...

  9. 用Python把20年的GDP、人口以及房价数据进行了可视化

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:CDA数据分析师 提到一线城市,大家马上会想到北上广深这四个超级大都 ...

  10. C++语法小记---类模板

    类模板 类模板和函数模板类似,主要用于定义容器类 类模板可以偏特化,也可以全特化,使用的优先级和函数模板相同 类模板不能隐式推倒,只能显式调用 工程建议: 模板的声明和实现都在头文件中 成员函数的实现 ...