golang中sync.RWMutex和sync.Mutex
来源:互联网 发布:mysql运行原理 编辑:程序博客网 时间:2024/05/16 10:10
golang中sync.RWMutex和sync.Mutex区别
转自:http://blog.csdn.net/chenbaoke/article/details/41957725
golang中sync包实现了两种锁Mutex (互斥锁)和RWMutex(读写锁),其中RWMutex是基于Mutex实现的,只读锁的实现使用类似引用计数器的功能.
type Mutex
- func (m *Mutex) Lock()
- func (m *Mutex) Unlock()
- type RWMutex
- func (rw *RWMutex) Lock()
- func (rw *RWMutex) RLock()
- func (rw *RWMutex) RLocker() Locker
- func (rw *RWMutex) RUnlock()
func (rw *RWMutex) Unlock()
其中Mutex为互斥锁,Lock()加锁,Unlock()解锁,使用Lock()加锁后,便不能再次对其进行加锁,直到利用Unlock()解锁对其解锁后,才能再次加锁.适用于读写不确定场景,即读写次数没有明显的区别,并且只允许只有一个读或者写的场景,所以该锁叶叫做全局锁.
func (m *Mutex) Unlock()用于解锁m,如果在使用Unlock()前未加锁,就会引起一个运行错误.
已经锁定的Mutex并不与特定的goroutine相关联,这样可以利用一个goroutine对其加锁,再利用其他goroutine对其解锁.
正常运行例子:
当Unlock()在Lock()之前使用时,便会报错
当在解锁之前再次进行加锁,便会死锁状态
RWMutex是一个读写锁,该锁可以加多个读锁或者一个写锁,其经常用于读次数远远多于写次数的场景.
func (rw *RWMutex) Lock() 写锁,如果在添加写锁之前已经有其他的读锁和写锁,则lock就会阻塞直到该锁可用,为确保该锁最终可用,已阻塞的 Lock 调用会从获得的锁中排除新的读取器,即写锁权限高于读锁,有写锁时优先进行写锁定
func (rw *RWMutex) Unlock() 写锁解锁,如果没有进行写锁定,则就会引起一个运行时错误.
func (rw *RWMutex) RLock() 读锁,当有写锁时,无法加载读锁,当只有读锁或者没有锁时,可以加载读锁,读锁可以加载多个,所以适用于"读多写少"的场景
func (rw *RWMutex)RUnlock() 读锁解锁,RUnlock 撤销单次 RLock 调用,它对于其它同时存在的读取器则没有效果。若 rw 并没有为读取而锁定,调用 RUnlock 就会引发一个运行时错误(注:这种说法在go1.3版本中是不对的,例如下面这个例子)。
分析:go1.3版本中出现这种情况的原因分析,通过阅读源码可以很清晰的得到结果
当RUnlock多于RLock多个时,便会报错,进入死锁.实例如下:
总结:
所以在go1.3版本中,运行过程中允许RUnLock早于RLock一个,也只能早于1个(注:虽然代码允许,但是强烈不推荐使用),并且在早于之后必须利用RLock进行加锁才可以继续使用.
- golang中sync.RWMutex和sync.Mutex
- GOLANG sync.Mutex和sync.RWMutex
- golang中sync.RWMutex和sync.Mutex区别
- golang sync mutex 互斥锁
- golang sync包的读写锁RWMutex的使用
- golang中并发sync和channel
- golang中并发sync和channel
- golang中并发sync和channel
- golang中并发sync和channel
- golang中并发sync和channel
- golang中读写锁RWMutex和通用锁Mutex的使用
- golang sync WaitGroup
- golang sync WaitGroup
- GOLANG sync.WaitGroup讲解
- GOLANG sync.Once
- golang中的sync.WaitGroup
- golang sync WaitGroup
- sync
- AT89C51小白的LTC1549 A/D转换器 电压表
- 新入手一个新系统,如何重构和梳理
- 纯C++版的Faster-Rcnn(通过caffe自定义RPN层实现)
- jq---在jq中如何扩充jQuery对象,$.fn.extend与$.extend的区别是什么?
- 华中农业大学第五届程序设计大赛 【10/12】个人训练总结
- golang中sync.RWMutex和sync.Mutex
- [转载]Python模块之Collections
- Lua知识点八 面向对象程序设计
- Hibernate 学习 (1)
- 求无序数组中三个元素相加与目标数最接近的三元素之和
- mysql-5.7.18-winx64 免安装配置
- ubuntu14.04 Torch7安装与配置GPU
- MATLAB求解线性规划(含整数规划和0-1规划)问题
- 《UNIX网络编程 卷1》 笔记: UNIX域协议