go语言Mutex与RWMutex用法
Mutex(互斥锁)
- Lock()加锁,Unlock()解锁
- 适用于读写不确定,并且只有一个读或者写的场景
例:
package main
import (
"sync"
"time"
)
var (
l *sync.Mutex
i int
)
func increment() {
l.Lock()
defer l.Unlock()
i++
}
func main() {
l = new(sync.Mutex)
for i := 0; i < 1000; i++ {
go increment()
}
println("i=", i)
time.Sleep(time.Second)
}
RWMutex(读写锁)
- 基于Mutex 实现,Lock()加写锁,Unlock()解写锁,RLock()加读锁,RUnlock()解读锁
- 多个goroutine可以同时读,读锁只会阻止写;只能一个同时写,写锁会同时阻止读写
- 适用于读多写少的场景
例:
package main
import (
"sync"
"time"
)
var (
l *sync.RWMutex
i int
)
func write() {
println("write start")
l.Lock()
i++
l.Unlock()
println("write end")
}
func read() {
println("read start")
l.RLock()
time.Sleep(time.Millisecond * 100)
println("read end, i =", i)
l.RUnlock()
}
func main() {
l = new(sync.RWMutex)
go read()
go read()
go write()
time.Sleep(time.Second)
}
以上代码中,会同时启动两个读和一个写,上述代码i的值可能会出现三种情况:
- (读读)写
写锁执行在两个读锁后执行,i输出为:0, 0 - 读写读
写锁在两个读锁中间执行,i输出为:0,1 - 写(读读)
写锁在两个读锁之前执行,i输出为:1,1
go语言Mutex与RWMutex用法的更多相关文章
- Go基础系列:互斥锁Mutex和读写锁RWMutex用法详述
sync.Mutex Go中使用sync.Mutex类型实现mutex(排他锁.互斥锁).在源代码的sync/mutex.go文件中,有如下定义: // A Mutex is a mutual exc ...
- C语言函数sscanf()的用法
从文件读取数据是一件很麻烦的事,所幸有sscanf()函数. C语言函数sscanf()的用法 sscanf() - 从一个字符串中读进与指定格式相符的数据. 函数原型: int sscanf( st ...
- C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com
原文:C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | I ...
- JAVA语言中冒号的用法
近来由于本人要介入android平台的开发,所以就买了本JAVA语言的书学习.学习一段时间来,我的感觉是谭浩强就是厉害,编写的<C编程语言>系列丛书不愧是经典.书中对C语言的介绍既系统又全 ...
- Unity 3D开发-C#脚本语言的一些基础用法
Unity 中C#语言的一些基础用法 本文提供全流程,中文翻译.Chinar坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) 1 Lerp -- 线 ...
- C语言函数sscanf()的用法(转)
转自:http://www.cnblogs.com/lyq105/archive/2009/11/28/1612677.html C语言函数sscanf()的用法 sscanf() - 从一个字符串中 ...
- Go语言的管道Channel用法
本文实例讲述了Go语言的管道Channel用法.分享给大家供大家参考.具体分析如下: channel 是有类型的管道,可以用 channel 操作符 <- 对其发送或者接收值. ch <- ...
- C语言函数sscanf()的用法-从字符串中读取与指定格式相符的数据(转)
C语言函数sscanf()的用法 sscanf() - 从一个字符串中读进与指定格式相符的数据. 函数原型: int sscanf( string str, string fmt, mixed var ...
- GO语言延迟函数defer用法分析
这篇文章主要介绍了GO语言延迟函数defer用法,较为详细的分析了GO语言的特性与具体用法,并给出了一个比较典型的应用实例,具有一定的参考借鉴价值,需要的朋友可以参考下 本文实例讲述了GO语言延迟 ...
随机推荐
- Druid学习---配置_DruidDataSource参考配置
[更多参考]https://www.cnblogs.com/niejunlei/p/5977895.html 配置_DruidDataSource参考配置 以下是一个参考的连接池配置: <bea ...
- JS实现快速排序算法
以下贴出两种实现方式,结果一样,但有些许的差别: 第一种: <script type="text/javascript"> var arr=[6,7,8,3,4,5,9 ...
- angularJs的作用域和依赖注入
一.angularJs的作用域 &scope这是局部作用域,先在局部作用域中找,如果没有就在全局作用域中找 &rootScope这是全局作用域 <!DOCTYPE HTML&g ...
- BZOJ 3224 Tyvj 1728 普通平衡树模板
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3224 题目大意: 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以 ...
- LOJ #6436. 「PKUSC2018」神仙的游戏
题目分析 通过画图分析,如果存在border长度为len,则原串一定是长度为n-len的循环串. 考虑什么时候无法形成长度为len的循环串. 显然是两个不同的字符的距离为len的整数倍时,不存在这样的 ...
- virtualbox+vagrant学习-2(command cli)-1-vagrant box命令
vagrant box 这是用于管理(添加.删除等)boxes的命令. box 是一个打包好的操作系统,是一个后缀名为 .box 的文件,其实是一个压缩包,里面包含了 Vagrant 的配置信息和 V ...
- 【zigbee】【蓝牙】射频信号放大器兼容AT2401C
现在科技产品的不断进步,智能家居方面慢慢对信号和距离方面的要求渐渐增加.深圳市动能世纪科技有限公司不断的满足客户需求,推出了一款射频信号放大器AT2401C满足客户距离信号等等的需求.并全方位技术支持 ...
- 学习使用 ARM 的 math 库,据说 速度比C标准库 自带的 快 几十倍 到几百倍
1.首先 添加 库 到 工程 ,路径 如下 C:\Keil\ARM\CMSIS\Lib\ARM 2.包含头文件以及在 工程里 添加 头文件 路径如下 C:\Keil\ARM\CMSIS\Includ ...
- SSIS中出现数据流数据源假死状态的解决办法
相信开发过Sql Server SSIS的人都遇到过在数据流中数据源假死的问题,特别是Excel Source特别容易假死,当job执行到数据流中的Excel Source时,既不报错也不执行,也没有 ...
- windows下nginx访问web目录提示403 Forbidden
在windows下 http服务器nginx时,访问web目录提示403 Forbidden,首先需要了解nginx出现403错误是什么意思: 403 Forbidden表示你在请求一个资源文件但是n ...