###互斥锁

其中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 实现, 互斥锁和读写锁相关推荐

  1. 问:为什么python中有了全局解释器锁GIL,还要有互斥锁?

    首先我们在进行对比之前,我们要知道什么是全局解释器锁,和什么是互斥锁,他们分别是用来做什么的才能解决这个问题. 首先介绍全局解释解释器锁GIL,Python代码的执行由Python 虚拟机(也叫解释器 ...

  2. AUTOSAR-自旋锁(spinlock)与互斥锁

    AUTOSAR多核OS为实现核间资源互斥,保证数据一致性,设计了自旋锁机制,该机制适用于核间资源互斥.对于多核概念,需要一种新的机制来支持不同内核上任务的互斥.这种新机制不应在同一内核上的 TASK ...

  3. 互斥量、读写锁长占时分析的利器——valgrind的DRD

    在进行多线程编程时,我们可能会存在同时操作(读.写)同一份内存的可能性.为了保证数据的正确性,我们往往会使用互斥量.读写锁等同步方法.(转载请指明出于breaksoftware的csdn博客) 互斥量 ...

  4. 并发编程概念、程序线程进程、线程同步、互斥量、读写锁、协程并发

    多线程: 多线程就是同时执行多个应用程序,需要硬件的支持 同时执行:不是某个时间段同时,cpu切换的比较快,所有用户会感觉是在同时运行 并发与并行: 并行(parallel):指在同一时刻,有多条指令 ...

  5. unix c线程同步的三种方法:互斥量、读写锁以及条件变-xhb8413-ChinaUnix博客

    unix c线程同步的三种方法:互斥量.读写锁以及条件变-xhb8413-ChinaUnix博客 unix c线程同步的三种方法:互斥量.读写锁以及条件变 2012-03-30 14:42:38 分类 ...

  6. python互斥锁_Python多线程如何使用互斥锁

    为解决多线程使用全局变量的问题,引入互斥锁,修改代码如下: from threading import Thread,Lock import time num = 0 def test1(): glo ...

  7. linux 信号量锁 内核,Linux内核信号量互斥锁应用

    主要介绍了Linux 内核关于信号量,互斥锁等的应用 内核同步机制-信号量/互斥锁/读-写信号量 sema ,mutex ,rwsem 信号量 通用信号量 用户类进程之间使用信号量(semaphore ...

  8. java 信号量 互斥锁_线程同步(互斥锁与信号量的作用与区别)

    "信号量用在多线程多任务同步的,一个线程完成了某一个动作就通过信号量告诉别的线程,别的线程再进行某些动作(大家都在semtake的时候,就阻塞在 哪里).而互斥锁是用在多线程多任务互斥的,一 ...

  9. linux 内核同步--理解原子操作、自旋锁、信号量(可睡眠)、读写锁、RCU锁、PER_CPU变量、内存屏障

    内核同步 内核中可能造成并发的原因: 中断–中断几乎可以在任何时刻异步发生,也就可以随时打断当前正在执行的代码. 软中断和tasklet–内核能在任何时刻唤醒或调度软中断和tasklet,打断当前正在 ...

最新文章

  1. 部署Oracle数据库
  2. python保留字的基本含义-python 33个保留字是什么意思
  3. 查找 之 散列表查找(哈希表)
  4. 关于AUC计算公式推导
  5. MIT开源高性能自动微分框架Enzyme:速度提升4.5倍
  6. Redis底层数据结构实现
  7. HALCON示例程序check_bottle_crate.hdev啤酒箱内酒瓶数检测
  8. k8s往secret里导入证书_K8S之Secret
  9. b站电脑客户端_如何将B站的flv格式的视频转换成mp4格式
  10. python读取word指定内容_python读取word 中指定位置的表格及表格数据
  11. 开单大师(开源可定制的房产管理系统) v3.6.9学习版
  12. Android小項目之---ListView实现论坛管理效果(附源碼)
  13. hibernate中antlr对于hql的词法分析源码解析
  14. linux系统安装xhprof,LNMP部署laravel与xhprof安装使用
  15. linux用dd命令刻录u盘,巧用linux dd命令刻录启动U盘
  16. unity3d贪吃蛇游戏源码,支持安卓+IOS双端 unity2019 C#语言开发
  17. 计算机教学能力大赛实施报告模板,教学能力比赛教学实施报告现场汇报PPT模板-橙色主题.pptx...
  18. [吐血推荐]超冷笑话集锦!
  19. summernote 工具栏相关
  20. Ubuntu下安装小企鹅fcitx输入法

热门文章

  1. WLST 命令和变量
  2. PCB设计3W、20H、五五规则
  3. 【潍坊seo公司】普通人都能学会的SEO,让你打破网络营销瓶颈
  4. python如何输入字母_python怎么输出单词的字母
  5. 黑苹果0x0501_黑苹果原版安装从零开始---3-clover配置篇
  6. 阿里百川淘宝联盟私域会员对接
  7. 微信 for Mac 3.0.0.1来袭 可以在电脑上刷朋友圈,附下载地址
  8. [python] 分治法查找数组元素的最大值和最小值
  9. 【技术邻】Icepak前处理 功能速览 | 技巧+应用
  10. 计算机人脸识别算哪个专业,人脸识别属于计算机什么领域(图文)