55 lines
1.1 KiB
Go
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("所有操作完成")
|
|
|
|
}
|