Go-标准库-sync(二)

2023-04-21 21:02:33 浏览数 (1)

读写锁(RWMutex)

读写锁(RWMutex)是互斥锁的一种扩展,可以用于在读多写少的场景下提高程序的并发性能。读写锁有三种状态:未锁定(Unlocked)、读锁定(Read-Locked)和写锁定(Write-Locked)。在未锁定状态下,任何 goroutine 都可以获取读写锁;在读锁定状态下,任何其它 goroutine 只能获取读锁(读共享、写互斥);在写锁定状态下,其它所有 goroutine 都不能获取读写锁。

读写锁提供了三个主要的方法:RLock()RUnlock()Lock()。其中,RLock() 方法用于获取读锁,可以被多个 goroutine 并发地调用;RUnlock() 方法用于释放读锁;Lock() 方法用于获取写锁,一旦写锁被获取,其它所有 goroutine 都不能获取读写锁。

下面是一个读写锁的示例代码:

代码语言:javascript复制
package main

import (
	"fmt"
	"sync"
	"time"
)

var data map[int]int
var rwMutex sync.RWMutex

func read(key int) int {
	rwMutex.RLock()
	defer rwMutex.RUnlock()
	return data[key]
}

func write(key, value int) {
	rwMutex.Lock()
	defer rwMutex.Unlock()
	data[key] = value
}

func main() {
	data = make(map[int]int)

	go func() {
		for i := 0; i < 10; i   {
			write(i, i)
			time.Sleep(100 * time.Millisecond)
		}
	}()

	go func() {
		for i := 0; i < 10; i   {
			fmt.Println(read(i))
			time.Sleep(100 * time.Millisecond)
		}
	}()

	time.Sleep(2 * time.Second)
}

在上面的示例代码中,我们定义了一个全局变量 data 和一个读写锁 rwMutexread() 函数用于从 data 中读取一个键对应的值,write() 函数用于向 data 中写入一个键值对。在 main() 函数中,我们启动了两个 goroutine:一个用于往 data 中写入数据,另一个用于读取 data 中的数据。由于读写锁的保护,写操作和读操作不会发生竞争条件,因此程序可以安全地并发执行。

go

0 人点赞