当阻塞的 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 块。