Files
bulma/rwmutex_demo.go
T

55 lines
1.1 KiB
Go

package main
import (
"fmt"
"sync"
"time"
)
var (
config string // 共享配置(读多写少)
rwmu sync.RWMutex // 读写锁
wg2 sync.WaitGroup
)
// 读操作:使用读锁(允许多个并发)
func readConfig(readerID int) {
defer wg2.Done()
rwmu.RLock() // 加读锁
defer rwmu.RUnlock() // 释放读锁
// 模拟读操作耗时
time.Sleep(100 * time.Millisecond)
fmt.Printf("读者%d: 读取配置=%s\n", readerID, config)
}
// 写操作:使用写锁(独占)
func writeConfig(writerID int, newConfig string) {
defer wg2.Done()
rwmu.Lock() // 加写锁
defer rwmu.Unlock() // 释放写锁
// 模拟写操作耗时
time.Sleep(300 * time.Millisecond)
config = newConfig
fmt.Printf("写者%d: 更新配置=%s\n", writerID, config)
}
func main() {
config = "初始配置"
// 启动10个读goroutine(并发执行)
for i := 0; i < 10; i++ {
wg2.Add(1)
go readConfig(i)
}
// 启动2个写goroutine(串行执行,且阻塞读)
for i := 0; i < 2; i++ {
wg2.Add(1)
go writeConfig(i, fmt.Sprintf("新配置%d", i+1))
}
wg2.Wait()
fmt.Println("所有操作完成")
}