😥 整理不易,此资源只针对正式星主开放,
还请入驻星球后再来观看。

GOLANG ROADMAP

阅读模式

  • 沉浸
  • 自动
  • 日常
首页
Go友会
  • 城市
  • 校园
Go学院
  • Go小课
  • Go小考
  • Go实战
  • 精品课
Go求职
  • 求职辅导🔥
  • Offer收割社群
  • 企业题库
  • 面试宝典
Go宝典
  • 在线宝典
  • B站精选
  • 推荐图书
  • 每日博文
Go仓库
实验区
  • Go周边
  • Go下载
  • Go月刊
消息
更多
  • 用户中心

    • 我的信息
    • 推广返利
  • 玩转星球

    • 星球介绍
    • 角色体系
    • 星主权益
  • 支持与服务

    • 联系星主
    • 成长记录
    • 常见问题
    • 吐槽专区
  • 合作交流

    • 渠道合作
    • 课程入驻
    • 友情链接
author-avatar

GOLANG ROADMAP


首页
Go友会
  • 城市
  • 校园
Go学院
  • Go小课
  • Go小考
  • Go实战
  • 精品课
Go求职
  • 求职辅导🔥
  • Offer收割社群
  • 企业题库
  • 面试宝典
Go宝典
  • 在线宝典
  • B站精选
  • 推荐图书
  • 每日博文
Go仓库
实验区
  • Go周边
  • Go下载
  • Go月刊
消息
更多
  • 用户中心

    • 我的信息
    • 推广返利
  • 玩转星球

    • 星球介绍
    • 角色体系
    • 星主权益
  • 支持与服务

    • 联系星主
    • 成长记录
    • 常见问题
    • 吐槽专区
  • 合作交流

    • 渠道合作
    • 课程入驻
    • 友情链接
  • Go真实面试题汇总系列

    • 《Mutex篇》
  • 宝典内容

    • 15. WaitGroup的坑
    • 18. 读写锁底层是怎么实现的
    • 34. go 的锁是可重入的吗?
    • 120. go中的互斥锁:正常、饥饿状态,读写锁中写操作如何阻止读操作?
    • 180. golang 的 waitGroup 用法
    • 225. golang如何知道或者检测死锁
    • 226. 怎么处理锁分段
    • 241. 互斥锁的底层实现
    • 289. go标准库的mutex介绍
    • 366. golang的锁有了解吗?
    • 368. go标准库的mutex介绍

😥 整理不易,此资源只针对正式星主开放,
还请入驻星球后再来观看。

18. 读写锁底层是怎么实现的


企业题库解析小组

题目序号:(3271)

题目来源:

频次: 1

答案1:(自由)

读写锁的底层是基于互斥锁实现的。

  • 为什么有读写锁,它解决了什么问题?(使用场景)
  • 它的底层原理是什么?

在这里我会结合 Go 中的读写锁 RWMutex 进行介绍。

我们通过与 Mutex 对比得出答案。Mutex 是不区分 goroutine 对共享资源的操作行为的,在读操作、它会上锁,在写操作,它也会上锁,当一段时间内,读操作居多时,读操作在 Mutex 的保护下也不得不变为串行访问,对性能的影响也就比较大了。

RWMutex 读写锁的诞生为了区分读写操作,在进行读操作时,goroutine 就不必傻傻的等待了,而是可以并发地访问共享资源,将串行读变成了并行读,提高了读操作的性能。

读写锁针对解决一类问题:readers-writes ,同时有多个读或者多个写操作时,只要有一个线程在执行写操作,其他的线程都不能进行读操作。

读写锁其实有三种工作模型:

  • Read-perferring 优先读设计,可能会导致写饥饿
  • Write-prferring 优先写设计,避免写饥饿
  • 不指定优先级 不区分优先级,解决饥饿问题

Go 中的读写锁,工作模型是 Write-prferring 方案。

答案2:(栾龙生)

  1. 读写锁解决问题

    主要应用于写操作少,读操作多的场景。读写锁满足以下四条规则。

    • 写锁需要阻塞写锁:一个协程拥有写锁时,其他协程写锁定需要阻塞;
    • 写锁需要阻塞读锁:一个协程拥有写锁时,其他协程读锁定需要阻塞;
    • 读锁需要阻塞写锁:一个协程拥有读锁时,其他协程写锁定需要阻塞;
    • 读锁不能阻塞读锁:一个协程拥有读锁时,其他协程也可以拥有读锁。
  2. 读写锁底层实现

    读写锁内部仍有一个互斥锁,用于将多个写操作隔离开来,其他几个都用于隔离读操作和写操作。

    源码包src/sync/rmmutex.go:RWMutex中定义了读写锁的数据结构

    type RWMutex struct {
    	w           Mutex  // held if there are pending writers
    	writerSem   uint32 // semaphore for writers to wait for completing readers
    	readerSem   uint32 // semaphore for readers to wait for completing writers
    	readerCount int32  // number of pending readers
    	readerWait  int32  // number of departing readers
    }
    
    1
    2
    3
    4
    5
    6
    7