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

相关推荐
云和数据.ChenGuang5 小时前
Python 重写(Override)深度解析:从 MRO 到 super() 的完整机制
java·开发语言·人工智能·python·langchain·1024程序员节
美狐美颜SDK开放平台6 小时前
视频美颜SDK试用DEMO阶段应该测试什么?直播APP接入实操指南
开发语言·人工智能·深度学习·音视频·美颜sdk·直播美颜sdk·第三方美颜sdk
dtq04246 小时前
C++小案例 - 日志实战
开发语言·c++
星夜离尘567 小时前
MATLAB ADC 码流触顶诊断:命中数、缺口分段与削顶不可辨识性
开发语言·matlab
码匠许师傅7 小时前
【C++三方组件】Qt 概览:桌面 C++ 的事实标准与许可证三轨
开发语言·c++·qt
Cosolar8 小时前
不收费、不加水印、数据归你:我做了个开源的在线简历工具
后端·面试·前端框架
码匠许师傅8 小时前
【C++三方组件】POCO:跨平台系统编程全家桶
开发语言·c++
bkspiderx9 小时前
基于Socket的广播通信及C语言实现详解
c语言·开发语言·socket·广播·socket的广播通信
小王C语言9 小时前
Qt常用控件:输入类控件,单行/多行输入框、下拉框、(日期)微调框、旋钮、滑动条
开发语言·qt
ESDWAN9 小时前
SD-WAN 主备切换为什么仍然会断网?从检测机制到会话恢复分析
开发语言·php