package main
import (
"fmt"
"sync"
"time"
)
/*
读写锁
多路只读
一路只写
读写互斥
*/
/*读写锁API介绍*/
func main101() {
var rwm sync.RWMutex
//锁定为写模式---一路只写
rwm.Lock()
//解锁写模式
rwm.Unlock()
//锁定为读模式---多路只读
rwm.RLock()
//释放读写锁
rwm.RUnlock()
}
/*
数据库一写多度
·Read方法设定为多路只读
·Write方法设定为单路只写
·创建5读5写10条协程,观察读写锁效果
*/
func main() {
var wg sync.WaitGroup
//声明读写锁
var rwm sync.RWMutex
for i := 0; i < 5; i++ {
wg.Add(1)
go func() {
//锁定为只读模式,运行多个协程同时抢到读锁
rwm.RLock()
fmt.Println("读取数据库")
<-time.After(3*time.Second)
//解读锁
rwm.RUnlock()
wg.Done()
}()
wg.Add(1)
go func() {
//锁定为写模式,只运行一个协程抢到写锁
rwm.Lock()
fmt.Println("写入数据库")
<-time.After(3*time.Second)
//解锁
rwm.Unlock()
wg.Done()
}()
}
wg.Wait()
fmt.Println("main over")
}