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

相关推荐
你的人类朋友3 分钟前
什么是API签名?
前端·后端·安全
昵称为空C2 小时前
SpringBoot3 http接口调用新方式RestClient + @HttpExchange像使用Feign一样调用
spring boot·后端
架构师沉默2 小时前
设计多租户 SaaS 系统,如何做到数据隔离 & 资源配额?
java·后端·架构
RoyLin3 小时前
TypeScript设计模式:适配器模式
前端·后端·node.js
该用户已不存在3 小时前
Mojo vs Python vs Rust: 2025年搞AI,该学哪个?
后端·python·rust
Moonbit3 小时前
MoonBit 正式加入 WebAssembly Component Model 官方文档 !
前端·后端·编程语言
Goland猫3 小时前
电商架构图
后端
Java中文社群4 小时前
重要:Java25正式发布(长期支持版)!
java·后端·面试
我是天龙_绍4 小时前
Whisper 通过 mp3输出中文
后端
zjjuejin4 小时前
Maven环境搭建
后端·maven