go中的读写锁RWMutex
转自: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相关推荐
- golang中的读写锁
简介 互斥锁本质是当一个协程访问的时候,其他协程都不能访问. 其实主要是想:修改数据要同步,这样其他协程才可以感知到,所以真正的互斥应该是读取和修改,修改和修改之间,读和读是没有互斥操作的必要的 读写 ...
- golang中关于读写锁、互斥锁的理解
锁的概述 为了解决协程同步的问题我们使用了channel,但是GO也提供了传统的同步工具. 它们都在GO的标准库代码包sync和sync/atomic中. 下面我们看一下锁的应用. 什么是锁呢?就是某 ...
- Gox语言中使用读写锁解决并发冲突以及如何实现线程同步归并-GX22
Gox语言中,除了可以直接使用Go语言中的通道对象(chan)之外,也直接引入了Go语言标准库中的sync包,因此可以直接使用共享锁Mutex对象或者读写锁RWMutex对象来处理并发操作中共享数据安 ...
- MongoDB中的读写锁
1. MongoDB 使用的锁 MongoDB 使用的是"readers-writer"锁, 可以支持并发但有很大的局限性 当一个读锁存在,许多读操作可以使用这把锁,然而, 当一个 ...
- Java中的读/写锁
原文链接 作者:Jakob Jenkov 译者:微凉 校对:丁一 相比Java中的锁(Locks in Java)里Lock实现,读写锁更复杂一些.假设你的程序中涉及到对一些共享资源的读和写操作,且写 ...
- java 读写锁_Java中的读写锁
一.读写锁 1.初识读写锁 a)Java中的锁--Lock和synchronized中介绍的ReentrantLock和synchronized基本上都是排它锁,意味着这些锁在同一时刻只允许一个线程进 ...
- Mysql中的读写锁,表锁和行锁,间隙锁
Mysql数据库锁 锁是计算机协调多个进程或线程并发访问某一资源的机制. 在数据库中,除传统的计算资源(如CPU.RAM.I/O等)的争用以外,数据也是一种供许多用户共享的资源.如何保证数据并发访问的 ...
- 同步方法中的锁对象_互斥锁与读写锁:如何使用锁完成Go程同步?
图转自https://colobu.com/2018/12/18/dive-into-sync-mutex/ 这张图容易让人产生误解,容易让人误以为goroutine1获取的锁,只有goroutine ...
- ReentrantReadWriteLock读写锁及其在 RxCache 中的使用
一. ReentrantReadWriteLock读写锁 Lock 是相当于 synchronized 更面向对象的同步方式,ReentrantLock 是 Lock 的实现. 本文要介绍的 Reen ...
最新文章
- 2021-07-12 深度学习服务器网络测试(顶会ECCV网络测试)
- 浅析网络推广外包公司如何完成营销型网站建设完成网络推广外包?
- 页面放在哪_seo页面怎么优化?seo页面优化有哪些方法?
- Windows下的socket演示程序
- 在android studio中配置ndk开发环境
- VTK/ITK 学习资料
- SAP Spartacus ConfigModule.withConfig的处理逻辑
- linux go环境安装和基本项目结构
- docker 搭建 web_《SpringBoot+Dubbo+Zookeeper整合搭建简单的分布式应用》
- 将DataRow转换为DataTable
- imos 学习笔记四 录像 c#
- 异常值检测——绝对中位差MAD(median absolute deviation )
- linux谷歌浏览器无法登陆,使用chrome/chrominum浏览器无法正常登陆deepin论坛的解决...
- php图片颤抖,PHP-使用jquery 怎么做出图片的震荡效果
- 干法:经营者应该怎样工作
- 打印机服务器端口无显示器,什么是打印机端口?无法找到打印机端口是怎么回事?...
- 阿里云服务器+微信公众号配置(Token验证不通过)
- VMT进阶1-自发光
- w10解决qq,微信语音自己说话别人听不到
- Makefile教程(超级详细)
热门文章
- Oracle 数据文件(Datafile ) 大小 限制 说明
- linux下使用select实现精确定时器
- 蓝桥杯 ALGO-112 算法训练 暗恋
- [Java] 蓝桥杯ADV-158 算法提高 新建Microsoft Word文档
- LeetCode 724. Find Pivot Index
- 第七届 蓝桥杯 省赛 第六题 方格填数(next_permutation)
- 【操作系统】对换、分页和分段方式-思维导图
- LeetCode 51. N-Queens
- 蓝桥杯 ADV-136算法提高 大数加法
- oracle的nvl和nvl2是什么函数,两者区别