我的编程空间,编程开发者的网络收藏夹
学习永远不晚

如何解读Go语言锁

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

如何解读Go语言锁

这篇文章将为大家详细讲解有关如何解读Go语言锁,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

var l sync.Mutexvar a stringfunc f() {a = "hello, world"l.Unlock()}func main() {l.Lock()go f()l.Lock()print(a)

}

sync 包中实现了两个关于锁的数据类型,sync.Mutex 和 sync.RWMutex。[ 互斥锁 mutex 是独占型,只能 lock 一次, unlock 一次,然后才能继续 lock 否则阻塞。 读写互斥锁 reader-writer mutex 是所有的 reader 共享一把锁或是一个 writer 独占一个锁, 如果一个 reader lock 到锁了, 其他的 reader 还可以 lock 但是 writer 不能 lock 。 ]

对于 sync.Mutex 或是 sync.RWMutex 类型的变量 mutex 来说,假定 n < m,对于 mutex.Unlock() 的第 n 次调用在 mutex.Lock() 的第 m 次调用返回之前发生。[ 对于一个 mutex 来说,lock 一下,第二次 lock 会阻塞,只有 unlock 一下才可以继续 lock,就是这个意思。然而 unlock 一个没有 lock 的 mutex 会怎么样呢?error ! ]

其实关键的就一点

每一次lock 之后是为了等待unclock的返回值,那么怎么确保unlock操作的之前的值返回呢,go种定义了 每一次lock 必须是在上一次unlock之后才会发生。所以这个程序是这么解读的:

1 .调用一次lock
2 .gorou里面对a赋值,进行写操作,此时unlock操作与写操作在同一个“线程”里面,并且unlock在写之后。
3 .调用l.lock()确保,此时必须的等到unlock完成。即lock发生在UNclock之后,更发生在赋值之后
4 .第二个lock发生在print之前,所以你懂得。

关于如何解读Go语言锁就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

如何解读Go语言锁

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Go语言中锁如何实现

今天小编给大家分享一下Go语言中锁如何实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。Lock// Lock locks
2023-07-05

Go语言互斥锁与读写锁实例分析

这篇“Go语言互斥锁与读写锁实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Go语言互斥锁与读写锁实例分析”文章吧。前
2023-06-29

如何解决Go语言中的死锁问题?

如何解决Go语言中的死锁问题?Go语言具有并发编程的特性,可以通过使用goroutine和channel来实现并发操作。然而,在并发编程中,死锁是一个常见的问题。当goroutine之间相互依赖于彼此的资源,并且在访问这些资源时产生了循环依
2023-10-22

go语言与Java语言差异解读

go语言与java语言的主要差异体现在语法、并发模型和运行时三个方面。语法上,go采用简洁语法,而java采用更冗长的语法。并发模型上,go以goroutine并发模型而闻名,而java通过线程和同步原语管理并发。运行时上,go编译为静态二
go语言与Java语言差异解读
2024-04-08

Go语言如何读取txt文档

这篇文章将为大家详细讲解有关Go语言如何读取txt文档,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。文档内容每行是一个文件名信息,含有空格区分不同项;ioutil.ReadFile返回的是[]bytes切
2023-06-28

如何解决Go语言中的并发文件的读写锁冲突问题?

如何解决Go语言中的并发文件的读写锁冲突问题?在Go语言中,我们经常会遇到需要同时对一个文件进行读写操作的场景,比如并发地写日志文件。如果不加以控制,多个goroutine同时对同一个文件进行读写操作,就会产生冲突,导致数据丢失或不一致。为
2023-10-22

Go语言如何实现读取文件

这篇文章主要介绍“Go语言如何实现读取文件”,在日常操作中,相信很多人在Go语言如何实现读取文件问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Go语言如何实现读取文件”的疑惑有所帮助!接下来,请跟着小编一起来
2023-07-05

GO语言协程互斥锁Mutex和读写锁RWMutex怎么用

本文小编为大家详细介绍“GO语言协程互斥锁Mutex和读写锁RWMutex怎么用”,内容详细,步骤清晰,细节处理妥当,希望这篇“GO语言协程互斥锁Mutex和读写锁RWMutex怎么用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一
2023-06-30

详解Go语言如何使用xorm实现读取mysql

目录一、介绍二、安装使用xorm,注意连接的关闭!关于连接数的坑以及engine.Close()常用方法介绍三、mysql生产struct四、xorm常用操作示例--insert数据4.1 insert 增加1条数据4.2 insert 增
2022-11-19

Go语言如何读取YAML配置文件

今天小编给大家分享一下Go语言如何读取YAML配置文件的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。yaml.v3 包yam
2023-07-04

go语言支持锁吗

go语言支持锁。go语言标准库中提供了两种锁:1、互斥锁(sync.Mutex),能保护一个资源不会因为并发操作而引起冲突导致数据不准确;2、读写锁(sync.RWMutex),在读锁占用的情况下,会阻止写,但不阻止读。在读多写少的环境中,可以优先使用读写互斥锁。
2023-05-14

解读Go语言实现的奥秘

go语言通过gc编译器编译为可执行文件,编译过程包括解析、ssa转换、优化和代码生成。其并发性基于csp模型,通过goroutine、通道和选择机制实现。垃圾收集器使用标记-清除算法回收未使用的内存。具体示例展示了goroutine和通道的
解读Go语言实现的奥秘
2024-04-03

编程热搜

目录