《Go题库·16》读写锁底层是怎么实现的

题目解析 GOLANG ROADMAP社区

答案(自由)

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

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

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

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

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

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

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

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

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

你可能感兴趣的:(golang)