sync.RWMutex 是针对读、写操作设计的单写多读锁。即同时可存在一个 Lock() 和多个 RLock()。

特性

  • RLock:读锁定
    1. 加读锁时,如果存在写锁则 RLock() 操作会阻塞当前 goroutine,直到写锁定解除为止;
    2. 没有写锁存在时,RLock() 操作不会阻塞 goroutine;
    3. 没有读锁的情况下进行 RUnLock() 操作会引发 panic 异常;
    4. RUnLock()的数量大于 RLock() 数量时,会引发 panic 异常;
  • Lock:写锁定
    1. 写锁的优先级大于读锁;
    2. 在加锁前,若存在其它读锁,Lock() 操作会阻塞当前 goroutine,直到其它读锁解除为止;
    3. Lock() 操作成功后,所有 RLock() 操作均会阻塞 goroutine;
    4. 在 Lock() 之前使用 UnLock() 会引发 panic 异常;

      Demo

      ```go package main

import ( “fmt” “sync” “time” )

func main() { rw := &sync.RWMutex{} rw.Lock() fmt.Println(“Locked”)

  1. for i := 0; i < 4; i++ {
  2. go func(i int) {
  3. fmt.Println("Not lock: ", i)
  4. rw.RLock()
  5. defer rw.RUnlock()
  6. fmt.Println("Locked: ", i)
  7. fmt.Println("Unlock the lock: ", i)
  8. }(i)
  9. }
  10. time.Sleep(time.Millisecond)
  11. fmt.Println("Unlock")
  12. rw.Unlock()
  13. time.Sleep(time.Millisecond)

} ``` image.png