简介

多个协程会操作一个特定资源,就会出现意想不到的错误类比脏读幻读等,所以我们使用互斥锁,

一个协程使用特定资源的时候进行锁定,用完解锁,

再让其他协程使用,所以其他协程想使用此资源,必须自己给资源解锁或等待正在使用的协程解锁

在代码中就是锁定一段代码,代码里面有资源。

注意

  • 在一个 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(七):互斥锁锁定一个资源 只有一个协程操作其他等待相关推荐

  1. golang设置运行CPU数量及sync.Mutex全局互斥锁的使用示例

    https://studygolang.com/pkgdoc

  2. c# 多线程 --Mutex(互斥锁) 【转】

    互斥锁(Mutex) 互斥锁是一个互斥的同步对象,意味着同一时间有且仅有一个线程可以获取它. 互斥锁可适用于一个共享资源每次只能被一个线程访问的情况 函数: //创建一个处于未获取状态的互斥锁 Pub ...

  3. go Mutex (互斥锁)和RWMutex(读写锁)

    golang中sync包实现了两种锁Mutex (互斥锁)和RWMutex(读写锁),其中RWMutex是基于Mutex实现的,只读锁的实现使用类似引用计数器的功能. type Mutex func ...

  4. php mutex,go互斥锁Mutex

    go mutex是互斥锁,只有Lock和Unlock两个方法,在这两个方法之间的代码不能被多个goroutins同时调用到. 看代码: package main import ( "fmt& ...

  5. 等待队列中为什么需要互斥锁?一个线程在等待时被唤醒后会做什么?安全队列的代码实现

    多线程2 同步 作用 条件变量及其接口 初始化 静态初始化 动态初始化 等待接口 唤醒接口 销毁接口 代码实现 参数为什么需要互斥锁 在调用该接口时,pthread_cond_wait函数的实现逻辑是 ...

  6. Go 学习笔记(23)— 并发(02)[竞争,锁资源,原子函数sync/atomic、互斥锁sync.Mutex]

    本文参考 <Go 语言实战> 1. 竞争状态简述 如果两个或者多个 goroutine 在没有互相同步的情况下,访问某个共享的资源,并试图同时读和写这个资源,就处于相互竞争的状态,这种情况 ...

  7. Mutex:互斥锁源码解读

    Mutex count++操作问题 count++是非原子操作,所以有并发问题 什么是原子操作 所谓原子操作是指不会被线程调度机制打断的操作:这种操作一旦开始,就一直运行到结束,中间不会有任何 con ...

  8. [openmp]使用嵌套互斥锁锁定变量

    本文出自:http://www.cnblogs.com/svitter 转载请注明出处. 如果有一个线程必须要同时加锁两次,只能用嵌套型锁函数 函数名称 描述 void omp_init_nest_l ...

  9. golang中的互斥锁

    简介 每个资源都对应一个可称为"互斥锁"的标记,这个标记用来保证在任意时刻,只有一个协程(线程)访问该资源.其他的协程只能等待 由标准库sync中的Mutex结构体类型表示. sy ...

最新文章

  1. es的分片和副本_Elasticsearch 集群分配多少分片合理
  2. DNS 映射解析应用(二)
  3. 安装惠普笔记本XP三种方法
  4. 【风控】团伙挖掘中的14大关系类型
  5. DataWorks功能实践速览 05——循环与遍历
  6. NoSQL开篇——为什么要使用NoSQL
  7. 理解分布式一致性:拜占庭容错与PBFT
  8. 欢乐纪中某B组赛【2018.12.22】
  9. 工业级以太网交换机的使用情况分析
  10. STM32 网络通信Web Server中 SSI与CGI的应用解析
  11. java方法不可覆盖_详解Java构造方法为什么不能覆盖,我的钻牛角尖病又犯了.......
  12. 有关Canvas的一点小事—图像绘制
  13. 删除顺序表中指定值的所有元素(C++,vector)
  14. 若依如何调整首页左侧菜单栏宽度
  15. 怎样阻止电脑开机自动安装大量垃圾软件
  16. Yii2中如何访问controller的二级目录下的控制器
  17. 23 个问题 TCP 疑难杂症全解析
  18. 《考勤信息管理系统》数据库 课程设计
  19. 佳能A系列数码相机(A720 IS)拍摄技巧大全
  20. iphone android传照片大小,快速地将iPhone/Android的照片传到电脑上

热门文章

  1. WebService入门篇
  2. php个人云存储,使用OwnCloud搭建个人私有云存储
  3. 学习能力和工作态度是准绳
  4. BM26 求二叉树的层序遍历(变形更新中)
  5. react router4 需要配置2遍BrowserRouter
  6. Xamarin.Android SharedPreferences的使用方法
  7. Zookeeper是什么?
  8. 卡斯特罗的离去对古巴科技产业的未来有何影响?
  9. maven 的安装配置 和编译java程序
  10. 【C++】函数缺省参数的作用