golang读写锁RWMutex

白玉雄 · 2015-03-06 23:00:00 · 45259 次点击 · 预计阅读时间 1 分钟 · 大约8小时之前 开始浏览    
这是一个创建于 2015-03-06 23:00:00 的文章,其中的信息可能已经有所发展或是发生改变。

读写锁是针对读写的互斥锁

基本遵循两大原则:

1、可以随便读,多个goroutine同时读

2、写的时候,啥也不能干。不能读也不能写

RWMutex提供了四个方法:

func (*RWMutex) Lock // 写锁定

func (*RWMutex) Unlock // 写解锁

func (*RWMutex) RLock // 读锁定

func (*RWMutex) RUnlock // 读解锁

一、随便读

package main

import (
    "sync"
    "time"
)

var m *sync.RWMutex

func main() {
    m = new(sync.RWMutex)
    
    // 多个同时读
    go read(1)
    go read(2)

    time.Sleep(2*time.Second)
}

func read(i int) {
    println(i,"read start")

    m.RLock()
    println(i,"reading")
    time.Sleep(1*time.Second)
    m.RUnlock()    

    println(i,"read over")
}
运行结果:

1 read start

1 reading 

2 read start

2 reading

1 read over

2 read over

可以看出1 读还没有结束,2已经在读


二、写的时候啥也不能干

package main

import (
    "sync"
    "time"
)

var m *sync.RWMutex

func main() {
    m = new(sync.RWMutex)
    
    // 写的时候啥也不能干
    go write(1)
    go read(2)
    go write(3)

    time.Sleep(2*time.Second)
}

func read(i int) {
    println(i,"read start")

    m.RLock()
    println(i,"reading")
    time.Sleep(1*time.Second)
    m.RUnlock()    

    println(i,"read over")
}

func write(i int) {
    println(i,"write start")

    m.Lock()
    println(i,"writing")
    time.Sleep(1*time.Second)
    m.Unlock()

    println(i,"write over")
}
输出:

1 write start

1 writing

2 read start

3 write start

1 writing over

2 reading

2 read over

3 writing

3 write over




有疑问加站长微信联系(非本文作者)

本文来自:每日go语言

感谢作者:白玉雄

查看原文:golang读写锁RWMutex

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

45259 次点击  ∙  1 赞  
加入收藏 微博
5 回复  |  直到 2020-09-18 23:21:47
baiyuxiong
baiyuxiong · #1 · 10年之前

站长你好: 此文章原创来自微信公众号 每日go语言(golang_everyday),链接: http://mp.weixin.qq.com/s?__biz=MzA4MzI2NTU4NA==&mid=206086131&idx=1&sn=a995fbaf2acdb409caf1b014ead3ab87#rd 此CSDN作者EthanDorisHope并非原创,且在文章中未注明出处,我已提出交涉,请站长修改文章中关于版权的描述。 谢谢

polaris
polaris · #2 · 10年之前
baiyuxiongbaiyuxiong #1 回复

站长你好: 此文章原创来自微信公众号 每日go语言(golang_everyday),链接: http://mp.weixin.qq.com/s?__biz=MzA4MzI2NTU4NA==&mid=206086131&idx=1&sn=a995fbaf2acdb409caf1b014ead3ab87#rd 此CSDN作者EthanDorisHope并非原创,且在文章中未注明出处,我已提出交涉,请站长修改文章中关于版权的描述。 谢谢

已经修改,感谢反馈!

lale
lale · #3 · 9年之前

这个例子不能反映 mutex的特效, 日志应该放在 锁和解锁之间

needkane
needkane · #4 · 8年之前

同意楼上,博主难道没觉得例子写的不太对吗

luowencai
luowencai · #5 · 5年之前

这个例子确实不太合适,虽然大致上概念是这样,我简化了,按道理更好理解:https://studygolang.com/articles/30759

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传