Golang如何使用 sync.RWMutex 进行 Goroutine 的读写锁同步?

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 都可以同时进行读取操作。