go 语言读写锁

读写锁概述

简单地说,读写锁就是一种能保证:

并发读操作之间不互斥;
并发写操作之间互斥;
并发读操作和写操作互斥;

的锁。

go 语言的 sync 包中包含 RWMutex,使用方法与普通的锁基本相同,唯一的区别在于读操作的加锁、释放锁用的是RLock方法和RUnlock方法。

一个示例

模拟一个场景 : 向数据库并发写入数据,同时并发读取数据 :

package main

import (
	"strconv"
	"sync"
	"time"
)

var wg sync.WaitGroup
var mutex sync.RWMutex

func main() {
	var students []string
	// 开启协程进行写操作
	wg.Add(1)
	go func() {
		mutex.RLock()
		for i := 0; i < 100; i++ {
			students = append(students, "姓名 "+strconv.Itoa(i))
		}
		time.Sleep(time.Second * 2)
		wg.Done()
		mutex.RUnlock()
		println("写操作完成")
	}()

	// 开启协程进行读操作数据
	for i := 0; i < 10; i++ {
		wg.Add(1)
		go func() {
			println("读数据执行中")
			time.Sleep(time.Millisecond * 200)
		}()
		wg.Done()
	}
	wg.Wait()
	for _, v := range students {
		println(v)
	}
	println("main done")
}