sync.RWMutex 是针对读、写操作设计的单写多读锁。即同时可存在一个 Lock() 和多个 RLock()。
特性
- RLock:读锁定
- 加读锁时,如果存在写锁则 RLock() 操作会阻塞当前 goroutine,直到写锁定解除为止;
- 没有写锁存在时,RLock() 操作不会阻塞 goroutine;
- 没有读锁的情况下进行 RUnLock() 操作会引发 panic 异常;
- RUnLock()的数量大于 RLock() 数量时,会引发 panic 异常;
- Lock:写锁定
import ( “fmt” “sync” “time” )
func main() { rw := &sync.RWMutex{} rw.Lock() fmt.Println(“Locked”)
for i := 0; i < 4; i++ {
go func(i int) {
fmt.Println("Not lock: ", i)
rw.RLock()
defer rw.RUnlock()
fmt.Println("Locked: ", i)
fmt.Println("Unlock the lock: ", i)
}(i)
}
time.Sleep(time.Millisecond)
fmt.Println("Unlock")
rw.Unlock()
time.Sleep(time.Millisecond)
} ```