RWMutex是一个读写锁,该锁可以加多个读锁或者一个写锁,其经常用于读次数远远多于写次数的场景。
func (rw *RWMutex) Lock()
Lock方法将rw锁定为写入状态,禁止其他线程读取或者写入。如果在添加写锁之前已经有其他的读锁和写锁,则lock就会阻塞直到该锁可用,为确保该锁最终可用,已阻塞的 Lock 调用会从获得的锁中排除新的读取器,即写锁权限高于读锁,有写锁时优先进行写锁定。
func (rw *RWMutex) Unlock()
Unlock方法解除rw的写入锁状态,如果m未加写入锁会导致运行时错误。
func (rw *RWMutex) RLock()
RLock方法将rw锁定为读取状态,禁止其他线程写入,但不禁止读取。
func (rw *RWMutex) RUnlock()
Runlock方法解除rw的读取锁状态,如果m未加读取锁会导致运行时错误。
读写锁的写锁只能锁定一次,解锁前不能多次锁定,读锁可以多次,但读解锁次数最多只能比读锁次数多一次,一般情况下我们不建议读解锁次数多余读锁
读写锁应用
读多写少的情况,用读写锁, 协程同时在操作读。
package main import ( "fmt" "math/rand" "sync" "time" ) var rwLock sync.RWMutex func main() { m := make(map[int]int, 5) m[1] = 10 m[2] = 10 m[3] = 10 m[4] = 10 m[5] = 10 for i := 0; i < 2; i++ { go func() { rwLock.Lock() m[5] = rand.Intn(100) rwLock.Unlock() }() } for i := 0; i < 10; i++ { go func() { rwLock.RLock() fmt.Println(m) rwLock.RUnlock() }() } time.Sleep(time.Second * 2) }
当RUnlock()在RLock()之前使用时便会报错,实例如下:
package main import ( "fmt" "sync" ) func main() { RWLock := new(sync.RWMutex) RWLock.RUnlock() fmt.Println("hello RWMutex") RWLock.RLock() }
运行错误:
fatal error: sync: RUnlock of unlocked RWMutex
特别声明:以上文章内容仅代表作者本人观点,不代表变化吧观点或立场。如有关于作品内容、版权或其它问题请于作品发表后的30日内与变化吧联系。
- 赞助本站
- 微信扫一扫
- 加入Q群
- QQ扫一扫
评论