07.rwLock - wwj-2017-1117/AES_OK GitHub Wiki
package main
// 01.level_0/go_workstation/41.DE/13.RW-V1.go import ( "fmt" "sync" "time" )
func test1() { var rwlock sync.RWMutex
read := func(i int) {
fmt.Println(i, "read start...")
rwlock.RLock()
fmt.Println(i, "reading...")
time.Sleep(1 * time.Second)
rwlock.RUnlock()
fmt.Println(i, "read over")
}
go read(1)
go read(2)
}
func main() { test1() time.Sleep(5 * time.Second) return }
/*
读写锁 读写锁(RWMutex)是根据互斥锁(Mutex)实现的。读写锁经常用于读远多于写的场景。 它可以针对读操作和写操作进行锁定和解锁。在读锁定管理的代码域内,允许任意的读操作同时进行。 读操作和写操作是互斥的,写操作和写操作也是互斥的
执行结果: 1 read start... 1 reading... 2 read start... 2 reading... 1 read over 2 read over
要点
l 读读操作不互斥,可以多个goroutine同时读锁定
2 读写操作互斥,所有的读锁定结束后才能进行写锁定
3 对没有读锁定的锁进行解锁,会引发一个panic
4 对读锁定进行写解锁,会引发一个panic */