sync.RWMutex 是 Go 语言中的读写锁,用于解决多个 Goroutine 对共享资源的读写冲突问题。
RWMutex 是一个结构体,包含两个字段:w 代表当前持有写锁的 Goroutine 数量,m 是一个互斥锁,用于保护 w 字段。读写锁的主要方法有:
1、Lock:获取写锁,如果已经被其他 Goroutine 持有,则当前 Goroutine 阻塞等待。
2、Unlock:释放写锁。
3、RLock:获取读锁,如果当前有 Goroutine 持有写锁,或者有其他 Goroutine 在等待获取写锁,则当前 Goroutine 阻塞等待。
4、RUnlock:释放读锁。
使用 RWMutex 进行读写锁同步的示例代码如下:
package main
import (
"fmt"
"sync"
"time"
)
var (
count int
rw sync.RWMutex
)
func main() {
for i := 0; i < 10; i++ {
go read(i)
}
for i := 0; i < 5; i++ {
go write(i)
}
time.Sleep(time.Second * 10)
}
func read(n int) {
for {
rw.RLock()
fmt.Printf("Goroutine %d read count: %d\n", n, count)
time.Sleep(time.Millisecond * 500)
rw.RUnlock()
}
}
func write(n int) {
for {
rw.Lock()
count++
fmt.Printf("Goroutine %d write count: %d\n", n, count)
time.Sleep(time.Second)
rw.Unlock()
}
}
该示例代码定义了一个全局变量 count 和一个 RWMutex 变量 rw,同时启动了 10 个读 Goroutine 和 5 个写 Goroutine。每个读 Goroutine 都会持续地读取 count 的值并打印出来,每个写 Goroutine 则会每秒增加一次 count 的值并打印出来。在写 Goroutine 执行 Lock 操作时,会阻塞所有的读 Goroutine;而在写 Goroutine 执行 Unlock 操作时,所有的读 Goroutine 都可以同时进行读取操作。