golang map 锁_go 安全map 实现, 互斥锁和读写锁
###互斥锁
其中Mutex为互斥锁,Lock()加锁,Unlock()解锁,使用Lock()加锁后,便不能再次对其进行加锁,直到利用Unlock()解锁对其解锁后,才能再次加锁.适用于读写不确定场景,即读写次数没有明显的区别,并且只允许只有一个读或者写的场景,所以该锁叶叫做全局锁.
package main
import (
"fmt"
"sync"
"errors"
)
type MyMap struct {
mp map[string]int
mutex *sync.Mutex
}
func (this *MyMap) Get(key string) (int, error) {
this.mutex.Lock()
i, ok := this.mp[key]
this.mutex.Unlock()
if !ok {
return i, errors.New("不存在")
}
return i, nil
}
func (this *MyMap) Set(key string, v int) {
this.mutex.Lock()
defer this.mutex.Unlock()
this.mp[key] = v
}
func (this *MyMap) Display() {
this.mutex.Lock()
defer this.mutex.Unlock()
for k,v := range this.mp {
fmt.Println(k, "=", v)
}
}
func SetValue(m *MyMap) {
var a rune
a = 'a'
for i:=0; i<10; i++ {
m.Set(string(a+rune(i)),i)
}
}
func main() {
m := &MyMap{mp:make(map[string]int), mutex:new(sync.Mutex)}
go SetValue(m) /*启动一个线程向 map 写入值*/
go m.Display() /*启动一个线程读取 map 的值*/
var str string /*这里主要是等待线程结束*/
fmt.Scan(&str)
}
###读写锁
读写锁即是针对于读写操作的互斥锁。它与普通的互斥锁最大的不同就是,它可以分别针对读操作和写操作进行锁定和解锁操作。读写锁遵循的访问控制规则与互斥锁有所不同。
在读写锁管辖的范围内,它允许任意个读操作的同时进行。但是,在同一时刻,它只允许有一个写操作在进行。并且,在某一个写操作被进行的过程中,读操作的进行也是不被允许的。
也就是说,读写锁控制下的多个写操作之间都是互斥的,并且写操作与读操作之间也都是互斥的。但是,多个读操作之间却不存在互斥关系。
package main
import (
"fmt"
"sync"
"errors"
)
type MyMap struct {
mp map[string]int
mutex *sync.RWMutex
}
func (this *MyMap) Get(key string) (int, error) {
this.mutex.RLock()
i, ok := this.mp[key]
this.mutex.RUnlock()
if !ok {
return i, errors.New("不存在")
}
return i, nil
}
func (this *MyMap) Set(key string, v int) {
this.mutex.RLock()
defer this.mutex.RUnlock()
this.mp[key] = v
}
func (this *MyMap) Display() {
this.mutex.RLock()
defer this.mutex.RUnlock()
for k,v := range this.mp {
fmt.Println(k, "=", v)
}
}
func SetValue(m *MyMap) {
var a rune
a = 'a'
for i:=0; i<10; i++ {
m.Set(string(a+rune(i)),i)
}
}
func main() {
m := &MyMap{mp:make(map[string]int), mutex:new(sync.RWMutex)}
go SetValue(m) /*启动一个线程向 map 写入值*/
go m.Display() /*启动一个线程读取 map 的值*/
var str string /*这里主要是等待线程结束*/
fmt.Scan(&str)
}
读写锁小例子
package main
import (
"fmt"
"sync"
"time"
)
func main() {
var lock sync.RWMutex
go read(&lock)
go read(&lock)
go write(&lock)
time.Sleep(25000000)
fmt.Println("end")
}
func read(lock *sync.RWMutex) {
lock.RLock()
fmt.Println("reading")
time.Sleep(5000)
fmt.Println("read end")
lock.RUnlock()
}
func write(lock *sync.RWMutex) {
time.Sleep(1000)//保证先让读拿到锁, 如果没有就会随机,不过应该先过read一般会先read.
lock.Lock()
fmt.Println("writing")
time.Sleep(5000)
fmt.Println("write end")
lock.Unlock()
}
//结果
reading
reading
read end
read end
writing
write end
end
参考
golang map 锁_go 安全map 实现, 互斥锁和读写锁相关推荐
- 问:为什么python中有了全局解释器锁GIL,还要有互斥锁?
首先我们在进行对比之前,我们要知道什么是全局解释器锁,和什么是互斥锁,他们分别是用来做什么的才能解决这个问题. 首先介绍全局解释解释器锁GIL,Python代码的执行由Python 虚拟机(也叫解释器 ...
- AUTOSAR-自旋锁(spinlock)与互斥锁
AUTOSAR多核OS为实现核间资源互斥,保证数据一致性,设计了自旋锁机制,该机制适用于核间资源互斥.对于多核概念,需要一种新的机制来支持不同内核上任务的互斥.这种新机制不应在同一内核上的 TASK ...
- 互斥量、读写锁长占时分析的利器——valgrind的DRD
在进行多线程编程时,我们可能会存在同时操作(读.写)同一份内存的可能性.为了保证数据的正确性,我们往往会使用互斥量.读写锁等同步方法.(转载请指明出于breaksoftware的csdn博客) 互斥量 ...
- 并发编程概念、程序线程进程、线程同步、互斥量、读写锁、协程并发
多线程: 多线程就是同时执行多个应用程序,需要硬件的支持 同时执行:不是某个时间段同时,cpu切换的比较快,所有用户会感觉是在同时运行 并发与并行: 并行(parallel):指在同一时刻,有多条指令 ...
- unix c线程同步的三种方法:互斥量、读写锁以及条件变-xhb8413-ChinaUnix博客
unix c线程同步的三种方法:互斥量.读写锁以及条件变-xhb8413-ChinaUnix博客 unix c线程同步的三种方法:互斥量.读写锁以及条件变 2012-03-30 14:42:38 分类 ...
- python互斥锁_Python多线程如何使用互斥锁
为解决多线程使用全局变量的问题,引入互斥锁,修改代码如下: from threading import Thread,Lock import time num = 0 def test1(): glo ...
- linux 信号量锁 内核,Linux内核信号量互斥锁应用
主要介绍了Linux 内核关于信号量,互斥锁等的应用 内核同步机制-信号量/互斥锁/读-写信号量 sema ,mutex ,rwsem 信号量 通用信号量 用户类进程之间使用信号量(semaphore ...
- java 信号量 互斥锁_线程同步(互斥锁与信号量的作用与区别)
"信号量用在多线程多任务同步的,一个线程完成了某一个动作就通过信号量告诉别的线程,别的线程再进行某些动作(大家都在semtake的时候,就阻塞在 哪里).而互斥锁是用在多线程多任务互斥的,一 ...
- linux 内核同步--理解原子操作、自旋锁、信号量(可睡眠)、读写锁、RCU锁、PER_CPU变量、内存屏障
内核同步 内核中可能造成并发的原因: 中断–中断几乎可以在任何时刻异步发生,也就可以随时打断当前正在执行的代码. 软中断和tasklet–内核能在任何时刻唤醒或调度软中断和tasklet,打断当前正在 ...
最新文章
- 部署Oracle数据库
- python保留字的基本含义-python 33个保留字是什么意思
- 查找 之 散列表查找(哈希表)
- 关于AUC计算公式推导
- MIT开源高性能自动微分框架Enzyme:速度提升4.5倍
- Redis底层数据结构实现
- HALCON示例程序check_bottle_crate.hdev啤酒箱内酒瓶数检测
- k8s往secret里导入证书_K8S之Secret
- b站电脑客户端_如何将B站的flv格式的视频转换成mp4格式
- python读取word指定内容_python读取word 中指定位置的表格及表格数据
- 开单大师(开源可定制的房产管理系统) v3.6.9学习版
- Android小項目之---ListView实现论坛管理效果(附源碼)
- hibernate中antlr对于hql的词法分析源码解析
- linux系统安装xhprof,LNMP部署laravel与xhprof安装使用
- linux用dd命令刻录u盘,巧用linux dd命令刻录启动U盘
- unity3d贪吃蛇游戏源码,支持安卓+IOS双端 unity2019 C#语言开发
- 计算机教学能力大赛实施报告模板,教学能力比赛教学实施报告现场汇报PPT模板-橙色主题.pptx...
- [吐血推荐]超冷笑话集锦!
- summernote 工具栏相关
- Ubuntu下安装小企鹅fcitx输入法
热门文章
- WLST 命令和变量
- PCB设计3W、20H、五五规则
- 【潍坊seo公司】普通人都能学会的SEO,让你打破网络营销瓶颈
- python如何输入字母_python怎么输出单词的字母
- 黑苹果0x0501_黑苹果原版安装从零开始---3-clover配置篇
- 阿里百川淘宝联盟私域会员对接
- 微信 for Mac 3.0.0.1来袭 可以在电脑上刷朋友圈,附下载地址
- [python] 分治法查找数组元素的最大值和最小值
- 【技术邻】Icepak前处理 功能速览 | 技巧+应用
- 计算机人脸识别算哪个专业,人脸识别属于计算机什么领域(图文)