Go的sync.Mutex(七):互斥锁锁定一个资源 只有一个协程操作其他等待
简介
多个协程会操作一个特定资源,就会出现意想不到的错误类比脏读幻读等,所以我们使用互斥锁,
一个协程使用特定资源的时候进行锁定,用完解锁,
再让其他协程使用,所以其他协程想使用此资源,必须自己给资源解锁或等待正在使用的协程解锁
在代码中就是锁定一段代码,代码里面有资源。
注意
- 在一个 goroutine 获得 Mutex 后,其他 goroutine 只能等到这个 goroutine 释放该 Mutex
- 使用 Lock() 加锁后,不能再继续对其加锁,直到利用 Unlock() 解锁后才能再加锁
- 在 Lock() 之前使用 Unlock() 会导致 panic 异常
- 已经锁定的 Mutex 并不与特定的 goroutine 相关联,这样可以利用一个 goroutine 对其加锁,再利用其他 goroutine 对其解锁
- 在同一个 goroutine 中的 Mutex 解锁之前再次进行加锁,会导致死锁
- 适用于读写不确定,并且只有一个读或者写的场景
参考
https://www.cnblogs.com/shockerli/p/golang-pkg-mutex.html
代码
package mainimport ("fmt""sync""time"
)func ccc(i int)(){mutex.Lock()fmt.Println("Lock:", i)time.Sleep(time.Second)fmt.Println("Unlock:", i)mutex.Unlock()defer wait.Done()
}
var mutex sync.Mutex
var wait = sync.WaitGroup{}func main() {fmt.Println("互斥锁")mutex.Lock()for i := 1; i <= 3; i++ {wait.Add(1)go ccc(i)}mutex.Unlock()wait.Wait()
}// 互斥锁锁定一个资源
// 其他的协程无法进行操作此段的资源 其他的协程都选择等待此段锁代码的结束
// 这个资源已经被当前的协程进行锁定,其他的协程也要操作此资源的都要等待
// 锁是表明一段代码中只能同步执行的
// 互斥锁
// Lock: 1
// Unlock: 1
// Lock: 3
// Unlock: 3
// Lock: 2
// Unlock: 2
Go的sync.Mutex(七):互斥锁锁定一个资源 只有一个协程操作其他等待相关推荐
- golang设置运行CPU数量及sync.Mutex全局互斥锁的使用示例
https://studygolang.com/pkgdoc
- c# 多线程 --Mutex(互斥锁) 【转】
互斥锁(Mutex) 互斥锁是一个互斥的同步对象,意味着同一时间有且仅有一个线程可以获取它. 互斥锁可适用于一个共享资源每次只能被一个线程访问的情况 函数: //创建一个处于未获取状态的互斥锁 Pub ...
- go Mutex (互斥锁)和RWMutex(读写锁)
golang中sync包实现了两种锁Mutex (互斥锁)和RWMutex(读写锁),其中RWMutex是基于Mutex实现的,只读锁的实现使用类似引用计数器的功能. type Mutex func ...
- php mutex,go互斥锁Mutex
go mutex是互斥锁,只有Lock和Unlock两个方法,在这两个方法之间的代码不能被多个goroutins同时调用到. 看代码: package main import ( "fmt& ...
- 等待队列中为什么需要互斥锁?一个线程在等待时被唤醒后会做什么?安全队列的代码实现
多线程2 同步 作用 条件变量及其接口 初始化 静态初始化 动态初始化 等待接口 唤醒接口 销毁接口 代码实现 参数为什么需要互斥锁 在调用该接口时,pthread_cond_wait函数的实现逻辑是 ...
- Go 学习笔记(23)— 并发(02)[竞争,锁资源,原子函数sync/atomic、互斥锁sync.Mutex]
本文参考 <Go 语言实战> 1. 竞争状态简述 如果两个或者多个 goroutine 在没有互相同步的情况下,访问某个共享的资源,并试图同时读和写这个资源,就处于相互竞争的状态,这种情况 ...
- Mutex:互斥锁源码解读
Mutex count++操作问题 count++是非原子操作,所以有并发问题 什么是原子操作 所谓原子操作是指不会被线程调度机制打断的操作:这种操作一旦开始,就一直运行到结束,中间不会有任何 con ...
- [openmp]使用嵌套互斥锁锁定变量
本文出自:http://www.cnblogs.com/svitter 转载请注明出处. 如果有一个线程必须要同时加锁两次,只能用嵌套型锁函数 函数名称 描述 void omp_init_nest_l ...
- golang中的互斥锁
简介 每个资源都对应一个可称为"互斥锁"的标记,这个标记用来保证在任意时刻,只有一个协程(线程)访问该资源.其他的协程只能等待 由标准库sync中的Mutex结构体类型表示. sy ...
最新文章
- es的分片和副本_Elasticsearch 集群分配多少分片合理
- DNS 映射解析应用(二)
- 安装惠普笔记本XP三种方法
- 【风控】团伙挖掘中的14大关系类型
- DataWorks功能实践速览 05——循环与遍历
- NoSQL开篇——为什么要使用NoSQL
- 理解分布式一致性:拜占庭容错与PBFT
- 欢乐纪中某B组赛【2018.12.22】
- 工业级以太网交换机的使用情况分析
- STM32 网络通信Web Server中 SSI与CGI的应用解析
- java方法不可覆盖_详解Java构造方法为什么不能覆盖,我的钻牛角尖病又犯了.......
- 有关Canvas的一点小事—图像绘制
- 删除顺序表中指定值的所有元素(C++,vector)
- 若依如何调整首页左侧菜单栏宽度
- 怎样阻止电脑开机自动安装大量垃圾软件
- Yii2中如何访问controller的二级目录下的控制器
- 23 个问题 TCP 疑难杂症全解析
- 《考勤信息管理系统》数据库 课程设计
- 佳能A系列数码相机(A720 IS)拍摄技巧大全
- iphone android传照片大小,快速地将iPhone/Android的照片传到电脑上