golang_锁: sync.RWMutex读写锁的用法介绍

版权声明:版权声明:本文为博主原创文章,转载请附上博文链接! 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() //解锁

猜你喜欢

转载自blog.csdn.net/weixin_43851310/article/details/87890662