简单地说,读写锁就是一种能保证:
并发读操作之间不互斥;
并发写操作之间互斥;
并发读操作和写操作互斥;
的锁。
go 语言的 sync 包中包含 RWMutex,使用方法与普通的锁基本相同,唯一的区别在于读操作的加锁、释放锁用的是RLock方法和RUnlock方法。
模拟一个场景 : 向数据库并发写入数据,同时并发读取数据 :
package main
import (
"strconv"
"sync"
"time"
)
var wg sync.WaitGroup
var mutex sync.RWMutex
func main() {
var students []string
// 开启协程进行写操作
wg.Add(1)
go func() {
mutex.RLock()
for i := 0; i < 100; i++ {
students = append(students, "姓名 "+strconv.Itoa(i))
}
time.Sleep(time.Second * 2)
wg.Done()
mutex.RUnlock()
println("写操作完成")
}()
// 开启协程进行读操作数据
for i := 0; i < 10; i++ {
wg.Add(1)
go func() {
println("读数据执行中")
time.Sleep(time.Millisecond * 200)
}()
wg.Done()
}
wg.Wait()
for _, v := range students {
println(v)
}
println("main done")
}