Go sync.RWMutex 使用示例

sync.RWMutex 是 Go 语言标准库中的读写互斥锁,适用于读多写少的并发场景。它允许同时有多个读取者(读者)访问共享资源,但只允许一个写入者(作者)独占访问。

下面是一个使用 sync.RWMutex 的示例:

Go 复制代码
package main

import (
	"fmt"
	"sync"
)

type SharedData struct {
	value int
	rwMu  sync.RWMutex
}

func (s *SharedData) Read() int {
	s.rwMu.RLock() // 获取读锁
	defer s.rwMu.RUnlock() // 无论是否发生 panic,确保释放读锁

	return s.value
}

func (s *SharedData) Write(newValue int) {
	s.rwMu.Lock() // 获取写锁
	defer s.rwMu.Unlock() // 无论是否发生 panic,确保释放写锁

	s.value = newValue
}

func main() {
	shared := &SharedData{value: 0}

	var wg sync.WaitGroup
	wg.Add(3)

	go func() {
		defer wg.Done()
		for i := 0; i < 5; i++ {
			fmt.Printf("Reader: Value is %d\n", shared.Read())
		}
	}()

	go func() {
		defer wg.Done()
		for i := 0; i < 5; i++ {
			shared.Write(i)
			fmt.Printf("Writer: Set value to %d\n", i)
		}
	}()

	go func() {
		defer wg.Done()
		for i := 0; i < 5; i++ {
			fmt.Printf("Reader: Value is %d\n", shared.Read())
		}
	}()

	wg.Wait()
}

在这个示例中:

  1. 定义了一个 SharedData 结构体,包含一个整数值 value 和一个 sync.RWMutex 类型的字段 rwMu,用于保护对 value 的并发访问。
  2. SharedData 结构体定义了两个方法: Read() 方法:获取读锁(RLock()),读取 value 并返回,然后释放读锁(RUnlock())。Write() 方法:获取写锁(Lock()),更新 value,然后释放写锁(Unlock())。
  3. 主函数中创建了一个 SharedData 实例 shared
  4. 启动三个并发任务(goroutines):第一个和第三个任务作为读者,不断读取 shared 的值并打印。第二个任务作为写者,循环设置 shared 的值,并打印已设置的值。
  5. 使用 sync.WaitGroup 确保所有 goroutines 执行完毕后,主程序才退出。

这个示例展示了如何使用 sync.RWMutex 来保护共享数据的并发读写。读取者(Read() 方法)使用读锁,允许多个读取者同时访问;写入者(Write() 方法)使用写锁,确保在写入期间没有其他读取者或写入者干扰。这样既能保证数据一致性,又能提高读取密集型场景下的并发性能。

相关推荐
考虑考虑2 小时前
docker compose V2版本新属性
运维·后端·自动化运维
浪子明X3 小时前
十六位账本怎样发现传输差错:Internet Checksum 生活类比
开发语言
GreenTea4 小时前
7000 万 QPS、500 PB:OpenAI 如何用一个 Python 存储平台撑住 10 亿用户
后端·架构
Flynt4 小时前
Java 27 升级实测:默认值动得比新特性多,有个老参数会让 JVM 直接起不来
java·jvm·后端
Bs_MoneyMagnet4 小时前
基于springboot+vue的个人健康管理系统的设计与实现 源码+文档
java·vue.js·spring boot·后端·vue3·springboot3·计算机毕业设计
GreenTea4 小时前
OpenAI Agents API 上手实测:一次调用把整个 agent loop 甩给 OpenAI
前端·后端·算法
xiangyun616 小时前
【408数据结构 08】队列:循环队列判空判满,408年年考,一次讲清
c语言·开发语言·数据结构·c++·算法
xiangyun616 小时前
【408数据结构 06】双链表、循环链表、静态链表
c语言·开发语言·数据结构·c++·算法
Bs_MoneyMagnet7 小时前
基于springboot+vue的心理咨询预约与随访平台的设计与实现 源码+文档
vue.js·spring boot·后端·spring·毕业设计·旅游·计算机毕业设计
IT_陈寒8 小时前
Vue的响应式更新把我坑惨了,原来问题出在这
前端·人工智能·后端