版权声明:版权声明:本文为博主原创文章,转载请附上博文链接! https://blog.csdn.net/weixin_43851310/article/details/87890662
sync.RWMutex 读写锁
type RWMutex struct { // 包含隐藏或非导出字段 }
RWMutex是读写互斥锁。该锁可以被同时多个读取者持有或唯一个写入者持有。RWMutex可以创建为其他结构体的字段;零值为解锁状态。RWMutex类型的锁也和线程无关,可以由不同的线程加读取锁/写入和解读取锁/写入锁。
Lock
func (rw *RWMutex) Lock()
Lock方法将rw锁定为写入状态,禁止其他线程读取或者写入。
Unlock
func (rw *RWMutex) Unlock()
Unlock方法解除rw的写入锁状态,如果m未加写入锁会导致运行时错误。
RLock
func (rw *RWMutex) RLock()
RLock方法将rw锁定为读取状态,禁止其他线程写入,但不禁止读取。
RUnlock
func (rw *RWMutex) RUnlock()
Runlock方法解除rw的读取锁状态,如果m未加读取锁会导致运行时错误。
RLocker
func (rw *RWMutex) RLocker() Locker
Rlocker方法返回一个互斥锁,通过调用rw.Rlock和rw.Runlock实现了Locker接口。
互斥锁在大量读操作的时候效率低下了。
如果读操作较多就建议使用读写锁。
特点:读共享,写独占,写优先
场景:
var num int=0
var rwMutex sync.RWMutex //读写锁
func write(i int){
for {
rwMutex.Lock() //加写锁
num=rand.Intn(100)
fmt.Printf("第%d个go程写%d\n",i,num)
rwMutex.Unlock() //解锁
time.Sleep(time.Millisecond*300)
}
}
func read(i int){
for {
rwMutex.RLock() //加读锁
fmt.Printf("\t第%d个go程读取%d\n",i,num)
rwMutex.RUnlock() //解锁
time.Sleep(time.Millisecond*300)
}
}
func main() {
rand.Seed(time.Now().UnixNano())
for i:=1;i<=5 ;i++ {
go write(i)
}
for i:=1;i<=5 ;i++ {
go read(i)
}
for {
;
}
}
运行结果:保证了数据读取的一致性。
总结:
读写锁:读操作较多
var rwMutex sync.RWMutex //声明一个读写锁
rwMutex.Lock() //加写锁
rwMutex.Unlock() //解锁
rwMutex.RLock() //加读锁
rwMutex.RUnlock() //解锁