读锁嵌套导致死锁(golang)

直接上死锁例子

package main
 
import (
	"sync"
	"time"
)
 
var lock sync.RWMutex
 
func main() {
	go func() {
		outRLock()
	}()
	time.Sleep(time.Second)
	wLock()
}
 
func outRLock() {
	lock.RLock()
	defer lock.RUnlock()
	time.Sleep(time.Second * 2)
	innerRLock()
}
 
func innerRLock() {
	lock.RLock()
	defer lock.RUnlock()
}
 
func wLock() {
	lock.Lock()
	defer lock.Unlock()
}

原因当有写锁申请时会阻塞掉新的读锁申请(写锁优先原则