关于读写锁的问题,其实概念上大致就是调用写锁方法阻塞所有方法,调用读锁方法阻塞所有写方法,读方法可以并发执行。
网上的例子往往太过于简单,非常容易误导,并且读写锁跟排他锁,信道不一样,概念稍微绕了一些,因此记录一下。
package main
import (
"log"
"runtime"
"sync"
"time"
)
var rwMutex sync.RWMutex
func runReadLock() {
log.Println("来到读锁方法")
rwMutex.RLock() // 与写锁构成互斥,在读的时候不允许写
defer rwMutex.RUnlock()
log.Println("运行的是上读锁方法,并不一定要读数据,这里休眠10秒")
time.Sleep(time.Second * 10)
}
func runWriteLock() {
log.Println("来到写锁方法")
rwMutex.Lock()
defer rwMutex.Unlock()
log.Println("运行的是上写锁方法,并不一定要写数据,这里休眠10秒")
time.Sleep(time.Second * 10)
}
func main() {
runtime.GOMAXPROCS(10)
for q := 0; q < 2; q++ {
go runWriteLock()
}
for k := 0; k < 3; k++ {
go runReadLock()
}
time.Sleep(time.Second * 1000)
}
效果:
2020/09/18 23:16:32 来到写锁方法
2020/09/18 23:16:32 来到读锁方法
2020/09/18 23:16:32 运行的是上写锁方法,并不一定要写数据,这里休眠10秒
2020/09/18 23:16:32 来到写锁方法
2020/09/18 23:16:32 来到读锁方法
2020/09/18 23:16:32 来到读锁方法
2020/09/18 23:16:42 运行的是上读锁方法,并不一定要读数据,这里休眠10秒
2020/09/18 23:16:42 运行的是上读锁方法,并不一定要读数据,这里休眠10秒
2020/09/18 23:16:42 运行的是上读锁方法,并不一定要读数据,这里休眠10秒
2020/09/18 23:16:52 运行的是上写锁方法,并不一定要写数据,这里休眠10秒
有疑问加站长微信联系(非本文作者)