转自:http://studygolang.com/articles/3027

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

基本遵循两大原则:
1、可以随便读。多个goroutin同时读。
2、写的时候,啥都不能干。不能读,也不能写。

解释:

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

RWMutex提供四个方法:

func (*RWMutex) Lock //写锁定
func (*RWMutex) Unlock //写解锁
func (*RWMutex) RLock //读锁定
func (*RWMutex) RUnlock //读解锁

代码实例:

1、可以随便读:

package mainimport ("sync""time"
)var m *sync.RWMutexfunc 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 mainimport ("sync""time"
)var m *sync.RWMutexfunc 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

转载于:https://www.cnblogs.com/zheng-chuang/p/6059322.html

go中的读写锁RWMutex相关推荐

  1. golang中的读写锁

    简介 互斥锁本质是当一个协程访问的时候,其他协程都不能访问. 其实主要是想:修改数据要同步,这样其他协程才可以感知到,所以真正的互斥应该是读取和修改,修改和修改之间,读和读是没有互斥操作的必要的 读写 ...

  2. golang中关于读写锁、互斥锁的理解

    锁的概述 为了解决协程同步的问题我们使用了channel,但是GO也提供了传统的同步工具. 它们都在GO的标准库代码包sync和sync/atomic中. 下面我们看一下锁的应用. 什么是锁呢?就是某 ...

  3. Gox语言中使用读写锁解决并发冲突以及如何实现线程同步归并-GX22

    Gox语言中,除了可以直接使用Go语言中的通道对象(chan)之外,也直接引入了Go语言标准库中的sync包,因此可以直接使用共享锁Mutex对象或者读写锁RWMutex对象来处理并发操作中共享数据安 ...

  4. MongoDB中的读写锁

    1. MongoDB 使用的锁 MongoDB 使用的是"readers-writer"锁, 可以支持并发但有很大的局限性 当一个读锁存在,许多读操作可以使用这把锁,然而, 当一个 ...

  5. Java中的读/写锁

    原文链接 作者:Jakob Jenkov 译者:微凉 校对:丁一 相比Java中的锁(Locks in Java)里Lock实现,读写锁更复杂一些.假设你的程序中涉及到对一些共享资源的读和写操作,且写 ...

  6. java 读写锁_Java中的读写锁

    一.读写锁 1.初识读写锁 a)Java中的锁--Lock和synchronized中介绍的ReentrantLock和synchronized基本上都是排它锁,意味着这些锁在同一时刻只允许一个线程进 ...

  7. Mysql中的读写锁,表锁和行锁,间隙锁

    Mysql数据库锁 锁是计算机协调多个进程或线程并发访问某一资源的机制. 在数据库中,除传统的计算资源(如CPU.RAM.I/O等)的争用以外,数据也是一种供许多用户共享的资源.如何保证数据并发访问的 ...

  8. 同步方法中的锁对象_互斥锁与读写锁:如何使用锁完成Go程同步?

    图转自https://colobu.com/2018/12/18/dive-into-sync-mutex/ 这张图容易让人产生误解,容易让人误以为goroutine1获取的锁,只有goroutine ...

  9. ReentrantReadWriteLock读写锁及其在 RxCache 中的使用

    一. ReentrantReadWriteLock读写锁 Lock 是相当于 synchronized 更面向对象的同步方式,ReentrantLock 是 Lock 的实现. 本文要介绍的 Reen ...

最新文章

  1. 2021-07-12 深度学习服务器网络测试(顶会ECCV网络测试)
  2. 浅析网络推广外包公司如何完成营销型网站建设完成网络推广外包?
  3. 页面放在哪_seo页面怎么优化?seo页面优化有哪些方法?
  4. Windows下的socket演示程序
  5. 在android studio中配置ndk开发环境
  6. VTK/ITK 学习资料
  7. SAP Spartacus ConfigModule.withConfig的处理逻辑
  8. linux go环境安装和基本项目结构
  9. docker 搭建 web_《SpringBoot+Dubbo+Zookeeper整合搭建简单的分布式应用》
  10. 将DataRow转换为DataTable
  11. imos 学习笔记四 录像 c#
  12. 异常值检测——绝对中位差MAD(median absolute deviation )
  13. linux谷歌浏览器无法登陆,使用chrome/chrominum浏览器无法正常登陆deepin论坛的解决...
  14. php图片颤抖,PHP-使用jquery 怎么做出图片的震荡效果
  15. 干法:经营者应该怎样工作
  16. 打印机服务器端口无显示器,什么是打印机端口?无法找到打印机端口是怎么回事?...
  17. 阿里云服务器+微信公众号配置(Token验证不通过)
  18. VMT进阶1-自发光
  19. w10解决qq,微信语音自己说话别人听不到
  20. Makefile教程(超级详细)

热门文章

  1. Oracle 数据文件(Datafile ) 大小 限制 说明
  2. linux下使用select实现精确定时器
  3. 蓝桥杯 ALGO-112 算法训练 暗恋
  4. [Java] 蓝桥杯ADV-158 算法提高 新建Microsoft Word文档
  5. LeetCode 724. Find Pivot Index
  6. 第七届 蓝桥杯 省赛 第六题 方格填数(next_permutation)
  7. 【操作系统】对换、分页和分段方式-思维导图
  8. LeetCode 51. N-Queens
  9. 蓝桥杯 ADV-136算法提高 大数加法
  10. oracle的nvl和nvl2是什么函数,两者区别