go语言sync包的mutex设计还是挺巧妙的,也看了网上其他介绍的文章,加锁的这个流程细节还是挺复杂,特别是里面用到了三个比特位来表示锁状态,我觉得主要明白其中心思想就好了。这里主要是利用goland编辑器的plantuml来画了一个时序图,熟悉一下plantuml的使用,感觉效果还行。

团队中多人开发,也可以用plantuml,如果其他人想修改流程,通过编辑plantuml代码可以很方便的修改图。而且画出来的效果看着还不错。

中心思想:
1.乐观锁,进来就尝试CAS修改锁状态进行抢锁
2.进入慢锁竞争等待流程
2.1 正常模式:唤醒等待队列时,会唤醒所有线程,谁先抢到锁就是谁的
2.2 饥饿模式:饥饿模式下排队,由释放锁的线程直接唤醒队列头部线程拿锁先到达的先获取锁,后到的进入队列尾部。

@startuml
'https://plantuml.com/sequence-diagram'自动编号'
autonumberclient -> mutex: 请求加锁
activate mutex #FFBBBB
alt 通过CAS判断当前锁是否空闲\n并操作当前锁的状态
mutex -[#FF0000]-> client: 空闲则尝试加锁,返回成功
note right: 结束 注释else 已加锁,进入慢加锁流程
loop 循环抢锁
alt 锁忙碌 AND 非饥饿模式 AND 系统可以自旋alt 当前线程非唤醒状态 AND \n互斥锁没有已经苏醒的线程 AND \n有其他线程等待锁
mutex --> mutex: 如修改互斥锁状态为有唤醒者成功\n就把当前线程标记为唤醒
endmutex --> mutex: 进入自旋 自旋记录+1 \n返回loop
endalt 当前互斥锁不是饥饿模式
mutex-->mutex: 标记临时变量为加锁
endalt 当前锁是忙碌或饥饿模式
mutex --> mutex: 标记临时变量队列等待数+1
endalt 如果是当前线程已是饥饿状态 AND 当前锁忙碌
mutex-->mutex: 标记临时变量为饥饿模式
endalt 如果当前线程是唤醒线程
mutex-->mutex: 标记临时变量为无唤醒线程
endalt 原子操作,将临时变量保存到锁变量,如成功
alt 如果锁以前是空闲 AND 非饥饿
mutex --> client:抢锁成功
note right
这里是正常模式下
各个线程竞争抢锁,成功就返回
end note
endmutex --> mutex: 阻塞等待信号量
mutex --> mutex: 其他释放锁,该线程被唤醒
mutex --> mutex: 检查自己的等待时间,判断是否进入饥饿状态alt 当前锁是饥饿模式
mutex --> mutex: 等待线程数减1\n计算锁的饥饿状态
mutex --> mutex: 修改锁状态
mutex --> client: 抢锁成功
note right
这里是饥饿模式下
由释放锁的线程直接唤醒队列头部线程拿锁
其他等待线程继续等待
end noteend note
end
mutex --> mutex: 标记自己为苏醒状态endend
deactivate mutexnote left
中心思想
1.乐观锁,进来就尝试CAS修改锁状态进行抢锁
2.进入慢锁竞争等待流程
2.1 正常模式:唤醒等待队列时,会唤醒所有线程,谁先抢到锁就是谁的
2.2 饥饿模式:饥饿模式下排队,由释放锁的线程直接唤醒队列头部线程拿锁先到达的先获取锁,后到的进入队列尾部
end note
@enduml

参考:

Go精妙的互斥锁设计

开源工具,使用简单的文字描述画UML图。

Go语言Mutex加锁流程相关推荐

  1. 读 MySQL 源码再看 INSERT 加锁流程

    欢迎关注方志朋的博客,回复"666"获面试宝典 在之前的博客中,我写了一系列的文章,比较系统的学习了 MySQL 的事务.隔离级别.加锁流程以及死锁,我自认为对常见 SQL 语句的 ...

  2. Java语言程序设计 上机实验2 掌握Java的基本语言成分和流程控制语句。 掌握Java中数组的使用,理解引用数据类型。 掌握String类的使用。...

      Java语言程序设计 上机实验2 实验目的: 掌握Java的基本语言成分和流程控制语句. 掌握Java中数组的使用,理解引用数据类型. 掌握String类的使用. 实验内容: 注:标(*)为选做内 ...

  3. go语言打印日期_go语言基础:流程控制(4)-多重循环跳转控制

    1.6 多重循环控制 1.6.1 概念解析 1)多重循环就是指将一个循环嵌套在另一个循环体内,就形成了嵌套循环.在外边的for循环称之为外层for循环,在里面的for循环称之为内层for循环.2)实质 ...

  4. C语言代码运行流程是怎样的

    C语言代码运行流程大致如下: 使用 C 编译器(如 GCC)将 C 源代码编译为可执行文件(也称为机器码或二进制文件). 在计算机的操作系统中找到并打开这个可执行文件. 操作系统将可执行文件加载到内存 ...

  5. 逆向易语言程序执行流程

    首先在生成可执行文件后,易语言编译器会提示你"是否将此程序的相关依赖写出到同一目录中" 程序流程如下(先假设此程序相关依赖文件写出到同一目录中): 1:使用GetModuleFil ...

  6. JAVA语言语法_流程控制(part3)

    文章目录 JAVA语言语法 三.流程控制 1.程序流程控制概述 2.顺序结构 3.分支结构 4.分支结构语句练习 5.加深键盘类Scanner类的使用 6.分支结构语句练习2 7.分支结构&s ...

  7. c语言酒店管理系统流程,c语言的酒店管理系统方案.doc

    .. .. .. .. 基于C语言的酒店管理系统课程设计 学院: 通信与电子工程学院 班级: 电子102班 学号: 2010131085 2010131012 姓名: 邹远文 王帅 指导老师: 题原 ...

  8. 【机器视觉】 HDevelop语言基础(四)-流程控制语句

    00. 目录 文章目录 00. 目录 01. 概述 02. if 03. if-else 04. elseif 05. while 06. until 07. for 08. continue 09. ...

  9. c语言程序的流程控制语句,三 C语言流程控制语句

    简介:流程控制语句 1.分支语句(条件语句) if/else(重点) switch/case 2.循环语句 for(重点) while do while 分支语句 1> if/else 按照一定 ...

最新文章

  1. Python入门学习笔记03(装饰器)
  2. json过滤特殊字符
  3. Scala 类中声明方法
  4. java 记事本换行_[求助]记事本自动换行
  5. AJAX 状态值(readyState)与状态码(status)详解
  6. 内核操作系统Linux内核变迁杂谈——感知市场的力量
  7. 【一】最新多智能体强化学习方法【总结】
  8. JS/VUE 自定义效验 统一社会信用代码 营业执照注册号
  9. 网站漏洞扫描工具AWVS_v13下载和安装
  10. 深度卷积神经网络是什么,卷积神经网络结构设计
  11. 用简单易懂的话语来快速入门windows缓冲区溢出
  12. 孙子算经-秦王暗点兵问题
  13. 教你用微信带称呼群发祝福
  14. Ie8兼容性问题web.config设置
  15. 出生证明电子版到哪里查看_注意注意,你家孩子的出生医学证明档案可电子查阅了...
  16. k均值聚类算法考试例题_k means聚类算法实例
  17. python列表or字符串切片步长为负数的情况分析
  18. unbuntu 中远程桌面连接 tab键不能用
  19. 研究生最后一年的计划与目标
  20. python分析微博粉丝_新浪微博Python SDK笔记——获取粉丝列表或关注列表 | 学步园...

热门文章

  1. VMP分析之VMP2.13流程分析(三)
  2. asmlinkage
  3. 我的计算机管理里面没有家庭组,Win10控制面板没有家庭组怎么解决?
  4. 飞鸽传书原理以及相关代码详解
  5. Spring配置hibernate读取实体类映射mappingResources,annotatedClasses,packagesToScan
  6. [opencv +VS2017] opencv、vs2017安装配置,环境搭建
  7. 小样本学习(Few-shot Learning)
  8. jquery如何获取iframe地址中的参数
  9. linux 访问虚拟磁盘,详解Linux物理主机Host访问虚拟机
  10. 手动部署一台Red Hat Enterprise 8服务器