08.rwlock - wwj-2017-1117/AES_OK GitHub Wiki
package main
// 01.level_0/go_workstation/41.DE/14.RW-V2.go import ( "fmt" "sync" "time" )
func test2() { var rwlock sync.RWMutex var v int
read := func(i int) {
rwlock.RLock()
fmt.Println(i, "read start")
fmt.Println(i, "reading v is ", v)
time.Sleep(1 * time.Second)
rwlock.RUnlock()
fmt.Println(i, "read end")
}
write := func(i int) {
rwlock.Lock()
fmt.Println(i, "write start")
v = i
time.Sleep(1 * time.Second)
fmt.Println(i, "write", i, "to v")
rwlock.Unlock()
fmt.Println(i, "write end")
}
go write(1)
go read(2)
go write(3)
go read(4)
}
func main() { test2()
time.Sleep(10 * time.Second)
return
}
/* 执行结果: 1 write start 1 write 1 to v 1 write end 2 read start 2 reading v is 1 4 read start 4 reading v is 1 4 read end 2 read end 3 write start 3 write 3 to v 3 write end
可以看到读操作和写操作都是互斥的: 1.读操作期间不会有写操作; 2.写操作期间不会有读操作; 3.同时写操作和写操作之间也是互斥的。
要点:
l 读写锁定是互斥的,写锁定结束后才能进行读锁定
2 写写锁定是互斥的,同一时刻只有一个写锁定。
3 对没有写锁定的锁,进行解锁会引发一个panic
4 对写锁定的锁进行读解锁会引发一个panic */