1、Go语言中的读写锁
1、读写锁的定义
var rw sync.RWMutex
2.、读锁锁定与解锁
rw.RLock()//上锁
rw.RUnlock()//解锁
3、写锁的锁定或解锁
rw.Lock()//上锁
rw.Unlock()//解锁
4、互斥情况
当读锁锁定时,可允许其他线程读锁还是可以继续,但是写锁不可继续
当写锁锁定时,其他线程读锁或者写锁都不可以继续
2、代码
package main
import (
"fmt"
"math/rand"
"sync"
)
var count int
var rw sync.RWMutex
func read(n int, ch chan int) {
rw.RLock()
fmt.Printf("线程%d,读取开始...\n", n)
v := count
fmt.Printf("线程%d,读取结束,值为:%d...\n", n, v)
rw.RUnlock()
ch <- 0
}
func write(n int, ch chan int) {
rw.Lock()
fmt.Printf("线程%d,写入开始...\n", n)
count = rand.Intn(1000)
fmt.Printf("线程%d,写入结束,值为%d...\n", n, count)
rw.Unlock()
ch <- 0
}
func main() {
ch := make(chan int, 10)
for i := 0; i < 5; i++ {
go read(i, ch)
}
for i := 0; i < 5; i++ {
go write(i, ch)
}
for i := 0; i < 10; i++ {
<-ch
}
}