go语言Mutex与RWMutex用法
2024-08-29 03:36:15
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
最新文章
- 导出本地和远程SVN项目, Export remote SVN repository
- Entity Framework 中的in操作实例
- TestLink测试软件安装条件检查不通过的解决方案
- 【BZOJ 4269】再见Xor
- 编写一个JSP程序实现用户登录
- 鸟哥笔记:postfix的一些重要配置文件
- Netty4.x中文教程系列(四) 对象传输
- Ubuntu Android Studio/IntelliJ IDEA 支持文件中文命名
- Struts—自定义一个简单的mystruct
- [PR &; ML 5] [Introduction] Decision Theory
- SpringBoot实践 - SpringBoot+mysql
- cocoapods卸载重装 解决clone,install,search很慢的问题
- struts2相关简单介绍
- ListView原理
- 4.28Linux(6)
- 周末班:Python基础之面向对象基础
- systemd的新特性及unit常见类型分析与awk用法示列
- idea编辑器快捷键调整
- QT上位机
- linux ls统计文件个数