前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >go中的读写锁RWMutex

go中的读写锁RWMutex

作者头像
李海彬
发布2018-03-20 10:52:39
7040
发布2018-03-20 10:52:39
举报
文章被收录于专栏:Golang语言社区

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

基本遵循两大原则:

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

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

解释:

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

RWMutex提供四个方法:

func (*RWMutex) Lock //写锁定

func (*RWMutex) Unlock //写解锁

func (*RWMutex) RLock //读锁定

func (*RWMutex) RUnlock //读解锁

代码实例:

1、可以随便读:

代码语言:javascript
复制
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、写的时候啥也不能干:

代码语言:javascript
复制
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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2016-02-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Golang语言社区 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档