RWMutex

RWMutex表示读写锁:
1.它允许任意读操作同时进行,主要用于读多写少的场景。即修改数据时候需要加锁读取不需要加锁。
2.读写锁控制下的多个写操作之间都是互斥的,当一个goroutine获取写锁的之后,其他的goroutine获取读写锁都会等待
3 当一个goroutine获取读锁之后,其他的goroutine获取写锁都会等待,但其他goroutine获取读锁时,都会继续获取锁
综上:1同时只能有一个 goroutine 能够获得写锁定;2同时可以有任意多个 goroutine 获得读锁定;3同时只能存在写锁定或读锁定(读和写互斥)。
写操作的锁定和解锁

  1. // Lock 将 rw 设置为写锁定状态,禁止其他例程读取或写入。
  2. func (rw *RWMutex) Lock()
  3. // Unlock 解除 rw 的写锁定状态,如果 rw 未被写锁定,则该操作会引发 panic。
  4. func (rw *RWMutex) Unlock()

读操作的锁定和解锁

  1. // RLock 将 rw 设置为读锁定状态,禁止其他例程写入,但可以读取。
  2. func (rw *RWMutex) RLock()
  3. // Runlock 解除 rw 的读锁定状态,如果 rw 未被读锁定,则该操作会引发 panic。
  4. func (rw *RWMutex) RUnlock()

注意:
写解锁在进行的时候会试图唤醒所有因欲进行读锁定而被阻塞的Goroutine.
读解锁在进行的时候只会在已无任何读锁定的情况下试图唤醒一个因欲进行写锁定而被阻塞的Goroutine
若对一个未被写锁定的读写锁进行写解锁,会引起一个运行时的恐慌
而对一个未被读锁定的读写锁进行读解锁却不会如此`
在读多写少的场景,读写锁的性能高于互斥锁