读写锁(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
和一个读写锁 rwMutex
。read()
函数用于从 data
中读取一个键对应的值,write()
函数用于向 data
中写入一个键值对。在 main()
函数中,我们启动了两个 goroutine:一个用于往 data
中写入数据,另一个用于读取 data
中的数据。由于读写锁的保护,写操作和读操作不会发生竞争条件,因此程序可以安全地并发执行。