当阻塞的 goroutine 的 RWMutex Unlock 被唤醒时
when an RWMutex Unlock which blocked goroutine will be waked up
var mu sync.RWMutex
//goroutine 1
go func() {
mu.Lock()
defer mu.Unlock()
//something else
}()
//goroutine 2
go func() {
mu.Lock()
defer mu.Unlock()
//something else
}()
//goroutine 3
go func() {
mu.RLock()
defer mu.RUnlock()
//something else
}()
//goroutine 4
go func() {
mu.RLock()
defer mu.RUnlock()
//something else
}()
goroutine 1 现在获得锁,goroutine 2,3,4 被阻塞。
当goroutine 1 释放锁时,哪个goroutine 会先被唤醒?随机?
为确保锁最终对写入者可用,阻塞的 Lock
调用会阻止新读取者获取锁。如果 goroutine 2 blocks on Lock
before goroutine 3 blocks on RLock
,则 goroutine 2 将 运行 before goroutine 3。如果 goroutine 3 blocks on RLock
before,则执行顺序未指定Lock
上的 goroutine 2 块。
var mu sync.RWMutex
//goroutine 1
go func() {
mu.Lock()
defer mu.Unlock()
//something else
}()
//goroutine 2
go func() {
mu.Lock()
defer mu.Unlock()
//something else
}()
//goroutine 3
go func() {
mu.RLock()
defer mu.RUnlock()
//something else
}()
//goroutine 4
go func() {
mu.RLock()
defer mu.RUnlock()
//something else
}()
goroutine 1 现在获得锁,goroutine 2,3,4 被阻塞。 当goroutine 1 释放锁时,哪个goroutine 会先被唤醒?随机?
为确保锁最终对写入者可用,阻塞的 Lock
调用会阻止新读取者获取锁。如果 goroutine 2 blocks on Lock
before goroutine 3 blocks on RLock
,则 goroutine 2 将 运行 before goroutine 3。如果 goroutine 3 blocks on RLock
before,则执行顺序未指定Lock
上的 goroutine 2 块。