题目解析 GOLANG ROADMAP 社区
答案(自在)
读写锁的底层是基于互斥锁实现的。
- 为什么有读写锁,它解决了什么问题?(应用场景)
- 它的底层原理是什么?
在这里我会联合 Go 中的读写锁 RWMutex 进行介绍。
咱们通过与 Mutex 比照得出答案。Mutex 是不辨别 goroutine 对共享资源的操作行为的,在读操作、它会上锁,在写操作,它也会上锁,当一段时间内,读操作居多时,读操作在 Mutex 的爱护下也不得不变为串行拜访,对性能的影响也就比拟大了。
RWMutex 读写锁的诞生为了辨别读写操作,在进行读操作时,goroutine 就不用傻傻的期待了,而是能够并发地访问共享资源,将串行读变成了并行读,进步了读操作的性能。
读写锁针对解决一类问题:readers-writes,同时有多个读或者多个写操作时,只有有一个线程在执行写操作,其余的线程都不能进行读操作。
读写锁其实有三种工作模型:
- Read-perferring 优先读设计,可能会导致写饥饿
- Write-prferring 优先写设计,防止写饥饿
- 不指定优先级 不辨别优先级,解决饥饿问题
Go 中的读写锁,工作模型是 Write-prferring 计划。
答案(栾龙生)
-
读写锁解决问题
次要利用于写操作少,读操作多的场景。读写锁满足以下四条规定。
- 写锁须要阻塞写锁:一个协程领有写锁时,其余协程写锁定须要阻塞;
- 写锁须要阻塞读锁:一个协程领有写锁时,其余协程读锁定须要阻塞;
- 读锁须要阻塞写锁:一个协程领有读锁时,其余协程写锁定须要阻塞;
- 读锁不能阻塞读锁:一个协程领有读锁时,其余协程也能够领有读锁。
-
读写锁底层实现
读写锁外部仍有一个互斥锁,用于将多个写操作隔离开来,其余几个都用于隔离读操作和写操作。
源码包
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
}
本文由:GOLANG ROADMAP 社区 公布