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() 方法)使用写锁,确保在写入期间没有其他读取者或写入者干扰。这样既能保证数据一致性,又能提高读取密集型场景下的并发性能。

相关推荐
IT_陈寒几秒前
为什么我的React状态更新总是不按套路出牌?
前端·人工智能·后端
小二·3 分钟前
WebGPU 浏览器端跑大模型:让AI在网页里跑起来(WebLLM/Transformers.js实战)
开发语言·javascript·人工智能
一路向北North6 分钟前
Spring Security OAuth2.0(22):分布式系统授权-搭建网关
java·后端·spring
小猴子爱上树8 分钟前
Temu批量视频翻译Python实现方案
开发语言·python·音视频
存在的五月雨11 分钟前
SpringBoot后端限制重复提交
java·spring boot·后端
IDIOSF20 分钟前
R语言 下载安装教程(附安装包)R语言4.5安装步骤(保姆级)
开发语言·其他·r语言
乱七八糟的屋子22 分钟前
LibYAML超全教程-C语言YAML解析与生成
c语言·开发语言·配置文件·yaml解析·libyaml·开源库实战
paopaokaka_luck29 分钟前
基于Springboot3+Vue3的宠物殡葬管理系统(webSocket实时通讯、接入腾讯地图、支付宝沙盒支付、Echarts图形化分析)
java·开发语言·网络·后端
卷无止境33 分钟前
Python 中基于 Qt 的 GUI 库授权方式全解析
后端·python
逝水无殇33 分钟前
HTML 元素详解
开发语言·前端·html