sync.RWMutex提供以下接口:
//写锁
func (rw *RWMutex) Lock()
//写解锁
func (rw *RWMutex) UnLock()
//读锁
func (rw *RWMutex) RLock()
//读解锁
func (rw *RWMutex) RUnLock()
规则:
·同一个时间只能有一个goroutine获取到写锁。
·同一个时间段可以有任意个goroutine获取到读锁。
·写锁与读锁互斥(即不能同时存在写锁与读锁)。
实例:
func main() {
//读写锁
var rwLock sync.RWMutex
for i := 0; i < 5; i++ {
go func(i int) {
//读锁
rwLock.RLock()
//释放读锁
defer rwLock.RUnlock()
fmt.Println("read func" + strconv.Itoa(i) + time.Now().String())
//延迟一秒看结果
time.Sleep(time.Second)
}(i)
}
for i := 0; i < 5; i++ {
go func(i int) {
//写锁
rwLock.Lock()
//释放写锁
defer rwLock.Unlock()
fmt.Println("write func" + strconv.Itoa(i) + time.Now().String())
time.Sleep(time.Second)
}(i)
}
}
其中可能的一个结果,验证了以上规则:
write func42021-10-17 21:47:52.975216 +0800 CST m=+0.041244452
read func02021-10-17 21:47:53.978075 +0800 CST