温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

golang中的读写锁

发布时间:2020-06-21 11:13:39 来源:亿速云 阅读:183 作者:元一 栏目:编程语言

读写锁实际是一种特殊的 自旋锁,它把对共享资源的访问者划分成读者和写者,读者只对共享资源进行读访问,写者则需要对共享资源进行写操作。这种锁相对于 自旋锁而言,能提高 并发性,因为在 多处理器系统中,它允许同时有多个读者来访问共享资源,最大可能的读者数为实际的逻辑CPU数。写者是排他性的,一个读写锁同时只能有一个写者或多个读者(与CPU数相关),但不能同时既有读者又有写者。是因为多个goroutine对同一个map产出了竞争,解决这个问题的方法有两个,一个是用sync.Map,另一个是加锁。sync.map是go1.9新加的特性,这里暂且先不讨论。而且当前业务场景用读写锁完全可以解决,所以决定使用读写锁。

golang中的读写锁

读写锁

RWMutex是一个读写锁,该锁可以加多个读锁或者一个写锁,其经常用于读次数远远多于写次数的场景。

func (rw *RWMutex) Lock()  写锁,如果在添加写锁之前已经有其他的读锁和写锁,则lock就会阻塞直到该锁可用,为确保该锁最终可用,已阻塞的 Lock 调用会从获得的锁中排除新的读取器,即写锁权限高于读锁,有写锁时优先进行写锁定

func (rw *RWMutex) Unlock() 写锁解锁,如果没有进行写锁定,则就会引起一个运行时错误

func (rw *RWMutex) RLock() 读锁,当有写锁时,无法加载读锁,当只有读锁或者没有锁时,可以加载读锁,读锁可以加载多个,所以适用于"读多写少"的场景

func (rw *RWMutex) RUnlock() 读锁解锁,RUnlock 撤销单次RLock 调用,它对于其它同时存在的读取器则没有效果。若 rw 并没有为读取而锁定,调用 RUnlock 就会引发一个运行时错误

概括:

读锁不能阻塞读锁

读锁需要阻塞写锁,直到所有读锁都释放

写锁需要阻塞读锁,直到所有写锁都释放

写锁需要阻塞写锁

上代码:

type MapWithLock struct {  //把读写锁和资源map封装在一起
    sync.RWMutex
    M map[string]Kline
}

var KlineDataMemory = make(map[string] interface{})
    var InstrLock sync.RWMutex
    var counter = MapWithLock{    // 生成一个带有锁和map的实例,然后就可以使用啦
        InstrLock,
        KlineDataMemory,
    }

    .
    .
    .

    counter.RLock()      //加读锁
        for _, v := range counter.M {
            instrID = v.InstrumentID
            break
        }
    counter.RUnlock()   //解除读锁    加锁和解锁必须成对出现,并且建议放在同一层次的代码块中

以上就是golang读锁有什么用的详细内容,更多请关注亿速云其它相关文章!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI