go mutex是互斥锁,只有Lock和Unlock两个方法,在这两个方法之间的代码不能被多个goroutins同时调用到。

看代码:

package main

import (

"fmt"

"sync"

"time"

)

var m *sync.Mutex

func main() {

m = new(sync.Mutex)

go lockPrint(1)

lockPrint(2)

time.Sleep(time.Second)

fmt.Printf("%s\n", "exit!")

}

func lockPrint(i int) {

println(i, "lock start")

m.Lock()

println(i, "in lock")

time.Sleep(3 * time.Second)

m.Unlock()

println(i, "unlock")

}

解读:

main函数里调用了两次lockPrint方法,这个方法中的println(i, "in lock")这句话,由于是在Mutex的Lock和Unlock之间,所以在第一次调用未被Unlock之前是不可能再被执行的。

结果:

2 lock start

2 in lock

1 lock start

2 unlock

1 in lock

exit!

从上面可以看到:第二行2 in lock打印以后,1 lock start已经进入调用了,但是直到2 unlock后 1才能in lock。

保证了Lock和Unlock之间的代码不能被同时调用。

有疑问加站长微信联系(非本文作者)

php mutex,go互斥锁Mutex相关推荐

  1. 互斥锁Mutex:鸿蒙轻内核中处理临界资源独占的“法官”

    摘要:本文带领大家一起剖析鸿蒙轻内核的互斥锁模块的源代码,包含互斥锁的结构体.互斥锁池初始化.互斥锁创建删除.申请释放等. 本文分享自华为云社区<鸿蒙轻内核M核源码分析系列十 互斥锁Mutex& ...

  2. 一文带你剖析LiteOS互斥锁Mutex源代码

    本文分享自华为云社区<LiteOS内核源码分析系列七 互斥锁Mutex>,原文作者:zhushy. 多任务环境下会存在多个任务访问同一公共资源的场景,而有些公共资源是非共享的临界资源,只能 ...

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

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

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

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

  5. 互斥锁(mutex lock)

    互斥锁 解决临界区最简单的工具就是互斥锁(mutex lock) 一个进程在进入临界区的时候获得锁(函数acquire) 在退出临界区时释放锁(函数release) 每个互斥锁都有一个布尔变量avai ...

  6. 多线程之互斥锁(mutex)的使用方法

    关于读写锁可查看:多线程之读写锁(unique_lock与shared_lock) 多个线程访问同一资源时,为了保证数据的一致性,最简单的方式就是使用 mutex(互斥锁). 引用 cpprefere ...

  7. 互斥锁Mutex解锁两次

    一般我们都知道互斥锁包含的代码段,同一时间只能被一个线程调用,如果一个线程已经获取到互斥锁,还在代码段中(还未解锁),此时另一个线程执行此段代码时,是获取不到互斥锁的. 那么已经解锁的互斥锁,还能再次 ...

  8. 互斥锁(mutex)

    原文地址:https://blog.csdn.net/qq_39736982/article/details/82348672 Linux中提供一把互斥锁mutex(也称之为互斥量). 每个线程在对资 ...

  9. android 线程互斥锁,线程锁(互斥锁Mutex)及递归锁

    一.线程锁(互斥锁) 在一个程序内,主进程可以启动很多个线程,这些线程都可以访问主进程的内存空间,在Python中虽然有了GIL,同一时间只有一个线程在运行,可是这些线程的调度都归系统,操作系统有自身 ...

最新文章

  1. php读取usb设备信息,急,请问如何获取USB设备的路径,非HID类型
  2. 前端学习(905):js执行机制
  3. js导出的xlsx无法打开_js-xlsx 导出表格至excel
  4. AWS RDS强制升级的应对之道——版本升级的最佳实践
  5. jinja Extends Blocks Include
  6. sqlserver安全加固
  7. Xcode9.x变很卡
  8. Android中如何使用Intent在Activity之间传递对象[使用Serializable或者Parcelable]
  9. 【组播技术入门 01】IP组播概述
  10. Ubuntu18.04安装教程
  11. python-漫天星星turtle and random
  12. swiper网格布局
  13. 1.数学建模比赛前期准备
  14. vant框架van-field
  15. 名帖96 赵孟頫 小楷《汉汲黯传》
  16. 网页状态码(HTTP状态码)。
  17. ipsec与服务器协议失败,IPSEC SA无法协商成功
  18. Redis主从与集群
  19. 竞品分析报告的几个错误
  20. [驱动][转载] 使自己的驱动无法卸载(包括Xuetr)

热门文章

  1. 新高考改革选计算机专业要学什么,2020高考改革后考生如何选科与选专业?
  2. python correlation_python scipy stats.random_correlation用法及代码示例
  3. vb里面计算误差咱们解决_盘点3dmax渲染出来是黑色的6个原因及解决方法
  4. WindowsAPI-------获取系统的相关信息
  5. Python爬虫项目--爱拍视频批量下载
  6. pthread_detach():主线程与子线程分离,子线程结束后,资源自动回收
  7. (2)Linux进程调度器-CPU负载
  8. ubuntu安装mysql报错_解决Ubuntu 12.04中更改MySQL默认编码报错
  9. 学校计算机教室局域网的建立,校园局域网组建及配置.pdf
  10. python3.6安装opencv3_python3.6.5安装opencv3