sync包的讀寫鎖RWMutex的使用(sync.RWMutex)
我們使用“讀寫”鎖的場景主要是在多線程的安全操作下,並且讀的情況多於寫的情況,也就是說既滿足多線程操作的安全性,也要確保性能不能太差,這時候,我們可以考慮使用讀寫鎖。當然你也可以簡單暴力直接使用互斥鎖(Mutex)。
RWMutex的使用主要事項
- 1、讀鎖的時候無需等待讀鎖的結束
- 2、讀鎖的時候要等待寫鎖的結束
- 3、寫鎖的時候要等待讀鎖的結束
- 4、寫鎖的時候要等待寫鎖的結束
RWMutex的四種操作方法
RLock() //讀鎖定
RUnlock() //讀解鎖
Lock() //寫鎖定
Unlock() //寫解鎖
廢話少說直接上代碼:
package main
import (
"sync"
"time"
)
var m *sync.RWMutex
func main() {
m = new(sync.RWMutex)
go write(1)
go read(21)
go write(3)
go read(22)
go write(4)
go read(23)
go write(5)
go read(24)
go write(6)
go read(25)
go write(7)
time.Sleep(20 * time.Second)
}
func read(i int) {
println(i, "read start")
m.RLock()
var p = 0
var pr = "read"
for {
pr += "."
if p == 10 {
break
}
time.Sleep(350 * time.Millisecond)
p++
println(i, pr)
}
m.RUnlock()
println(i, "read end")
}
func write(i int) {
println(i, "write start")
m.Lock()
var p = 0
var pr = "write"
for {
pr += "."
if p == 10 {
break
}
time.Sleep(350 * time.Millisecond)
p++
println(i, pr)
}
m.Unlock()
println(i, "write end")
}
執行結果: