请选择 进入手机版 | 继续访问电脑版

[Golang] Golang并发操作中常见的读写锁详析

[复制链接]
查看154 | 回复28 | 2021-9-15 03:04:39 | 显示全部楼层 |阅读模式

互斥锁简单粗暴,谁拿到谁操作。本日 给大家先容 一下读写锁,读写锁比互斥锁略微复杂一些,不过我信赖 我们本日 可以或许 把他拿下!

golang读写锁,其特性 在于

  • 读锁:可以同时举行 多个协程读操作,不答应 写操作
  • 写锁:只答应 同时有一个协程举行 写操作,不答应 其他写操作和读操作

读写锁有两种模式。没错!一种是读模式,一种是写模式。当他为写模式的话,作用和互斥锁差不多,只答应 有一个协程抢到这把锁,其他协程乖乖列队 。但是读模式就不一样了,他答应 你多个协程读,但是不能写。总结起来就是:

  • 仅读模式: 多协程可读不可写
  • 仅写模式: 单协程可写不可读

在32位的操作体系 中,针对int64范例 的值的读和写操作都不大概 仅由一个CPU指令来完成。如若一个写操作刚刚实行 完第一个指令,就去举行 另一个读的协程,如许 就会读到一个错误的数据。

下面看个例子吧:

先看主函数:

  1. func main() {
  2. for i:=0;i<5;i++{
  3. wg06.Add(1)
  4. go write(i)
  5. wg06.Add(1)
  6. go read(i)
  7. }
  8.    wg06.Wait()
  9. }
复制代码

每次开发 两条协程,一条协程实行 写函数,另一条实行 读函数。然后放入等待组。共开发 五次。

在来看一看写函数

  1. func write(i int) {
  2. //锁定为仅写模式,其他协程被阻塞
  3. rwm.Lock()
  4. fmt.Println(i,"writing...")
  5. <- time.After(10*time.Second)
  6. fmt.Println("write over!")
  7. rwm.Unlock()
  8. //解锁仅写模式
  9. wg06.Done()
  10. }
复制代码

这个Lock()就是实行 读写锁的写模式,当这个模式举行 时,只有这条协程能写,其他协程都被壅闭 。Unlock()就是解锁这个仅锁模式,等待组中的其他协程不再被壅闭 。

再看一看读模式:

  1. func read(i int) {
  2. rwm.RLock()
  3. fmt.Println(i,"reading...")
  4. <-time.After(10 * time.Second)
  5. fmt.Println(i,"read over!")
  6. rwm.RUnlock()
  7. wg06.Done()
  8. }
复制代码

RLock()就是实行 读写锁的读模式,实行 这个模式其他协程也能读,但是都不能写。

假如 程序运行,写协程先抢到锁,全部 协程就不能读,只有这条写协程能写,其他人都等着。假如 是读协程抢到锁,以是 写协程就不大概 了,但是读协程仍旧 可以抢。

如今 你知道我们应该什么时间 使用 读写锁了吗?

在并发举行 读写操作时,当读的次数远远超过写的次数的环境 下,应该使用 读写锁来举行 读写并发操作。

Golang读写锁底层原理

在加读锁和写锁的工程中都使用 atomic.AddInt32来举行 递增,而该指令在底层是会通过LOCK来举行 CPU总线加锁的,因此多个CPU同时实行 readerCount着实 只会有一个成功,从这上面看着实 是写锁与读锁之间是相对公平的,谁先达到谁先被CPU调度实行 ,举行 LOCK锁cache line成功,谁就加成功锁

底层实现的CPU指令

底层的2条指令,通过LOCK指令共同 CPU的MESI协议,实现可见性和内存屏蔽 ,同时通过XADDL则用来保证原子性,从而办理 可见性与原子性题目

  1. // atomic/asm_amd64.s TEXT runtime∕internal∕atomic·Xadd(SB)
  2. LOCK
  3. XADDL AX, 0(BX)
复制代码

可见性与内存屏蔽 、原子性, 此中 可见性通常是指在cpu多级缓存下怎样 保证缓存的划一 性,即在一个CPU上修改了了某个数据在其他的CPU上不会继续读取旧的数据,内存屏蔽 通常是为了CPU为了进步 流水线性能,而对指令举行 重排序而来,而原子性则是指的实行 某个操作的过程的不可分割

总结

到此这篇关于Golang并发操作中常见读写锁的文章就先容 到这了,更多干系 Golang并发读写锁内容请搜刮 脚本之家从前 的文章或继续欣赏 下面的干系 文章渴望 大家以后多多支持脚本之家!


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

avatar 陆子525630 | 2021-9-15 05:47:54 | 显示全部楼层
admin楼主很有艺术范!
回复

使用道具 举报

avatar 无缘人1 | 2021-9-21 18:56:16 | 显示全部楼层
读了admin楼主的帖子,顿时马桶就通了。。。
回复

使用道具 举报

avatar 李志敏 | 2021-9-22 12:15:30 | 显示全部楼层
终于看完了,很不错!
回复

使用道具 举报

avatar 啤酒瓶空了缓 | 2021-9-26 18:53:07 | 显示全部楼层
我就搞不明白了,看帖回帖能死人么,居然只有我这么认真的在回帖!
回复

使用道具 举报

avatar 永远丶并不远 | 2021-9-29 01:17:07 | 显示全部楼层
admin楼主是男的还是女的?
回复

使用道具 举报

avatar 匣中剑他娘官 | 2021-10-6 05:22:36 | 显示全部楼层
admin楼主是一个神奇的青年!
回复

使用道具 举报

avatar 想出轨逗 | 2021-10-9 00:57:19 | 显示全部楼层
强,我和我的小伙伴们都惊呆了!
回复

使用道具 举报

avatar 聪明牛得 | 2021-10-9 15:05:45 | 显示全部楼层
admin楼主的帖子提神醒脑啊!
回复

使用道具 举报

avatar 十二音阶囤 | 2021-10-11 23:23:50 | 显示全部楼层
顶一个!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则