分享
  1. 首页
  2. 文章

go中的读写锁RWMutex

baiyuxiong · · 13548 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

读写锁是针对于读写操作的互斥锁。

基本遵循两大原则:

1、可以随便读。多个goroutin同时读。

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

解释:

在32位的操作系统中,针对int64类型值的读操作和写操作不可能只由一个CPU指令完成。如果一个写的操作刚执行完了第一个指令,时间片换给另一个读的协程,这就会读到一个错误的数据。

RWMutex提供四个方法:

func (*RWMutex) Lock //写锁定

func (*RWMutex) Unlock //写解锁

func (*RWMutex) RLock //读锁定

func (*RWMutex) RUnlock //读解锁

代码实例:

1、可以随便读:

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 end")
}

运行结果:

1 read start

1 reading

2 read start

2 reading

1 read end

2 read end

可以看到1读还没结束(倒数第二行)的时候,2已经在读(倒数第三行)了。

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(4 * 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 end")
}
 
func write(i int) {
println(i, "write start")
 
m.Lock()
println(i, "writing")
time.Sleep(1 * time.Second)
m.Unlock()
 
println(i, "write end")
}

输出:

1 write start

1 writing

2 read start

3 write start

1 write end

2 reading

2 read end

3 writing

3 write end

可以看到:

1、1 write end结束之后,2才能reading

2、2 read end结束之后,3 才能writing


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

本文来自:博客园

感谢作者:baiyuxiong

查看原文:go中的读写锁RWMutex

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

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

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏