图解:Go Mutext

news2024/12/25 6:20:06

Mutex 可能处于两种不同的模式:正常模式和饥饿模式。

正常模式下获取Mutex

在正常模式下,新来的G会尝试自旋获取锁,如果自旋获取失败,则会按照FIFO的顺序排队获取锁。

image-20221206093354569

当Mutex被释放,会唤醒等待队列中第一个等待者G,它需要和新来的 G们竞争Mutex的使用权。而新来的G会更有优势,它们已经在CPU上运行且它们的数量更多。因此一个刚被唤醒的等待者很大概率获取不到锁,在这种情况下,它会被放置到等待队列的队首。

Mutex进入饥饿模式

如果一个G等待Mutex的释放超过1ms,它就会将Mutex切换到饥饿模式

image-20221206093806043

处于饥饿模式中,Mutex的所有权直接从解锁的G递交给等待队列中排在最前方的G。

image-20221206093912714

处于饥饿模式中,新到达的G不再尝试自旋获取Mutex,而是直接置于等待队列尾部。

image-20221206093957088

Mutex切换到正常模式

以下两种情况下Mutex会被切换到正常模式

当一个G获得Mutex的所有权时,它的等待时间小于1ms,它便将Mutex切换回正常模式

image-20221206094143695

当一个G获得Mutex的所有权时,它是等待队列中的最后一个,它将Mutex切换回正常模式

image-20221206094257444

总结

Mutex 可能处于两种不同的模式:正常模式和饥饿模式。

在正常模式中,等待者按照 FIFO 的顺序排队获取锁,但是一个被唤醒的等待者有时候并不能获取 mutex, 它还需要和新到来的 goroutine 们竞争 mutex 的使用权。 新到来的 goroutine 存在一个优势,它们已经在 CPU 上运行且它们数量很多, 因此一个被唤醒的等待者有很大的概率获取不到锁,在这种情况下它处在等待队列的前面。 如果一个 goroutine 等待 mutex 释放的时间超过 1ms,它就会将 mutex 切换到饥饿模式

在饥饿模式中,mutex 的所有权直接从解锁的 goroutine 递交到等待队列中排在最前方的 goroutine。 新到达的 goroutine 们不要尝试去获取 mutex,即使它看起来是在解锁状态,也不要试图自旋, 而是排到等待队列的尾部。

如果一个等待者获得 mutex 的所有权,并且看到以下两种情况中的任一种:

  1. 它是等待队列中的最后一个,
  2. 它等待的时间少于 1ms,它便将 mutex 切换回正常操作模式

正常模式下的性能会更好,因为一个 goroutine 能在即使有很多阻塞的等待者时多次连续的获得一个 mutex,饥饿模式的重要性则在于避免了病态情况下的尾部延迟。

参考资料

  • https://golang.design/under-the-hood/zh-cn/part1basic/ch05sync/mutex/
  • https://www.bilibili.com/video/BV15V411n7fM/?spm_id_from=333.999.0.0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/65658.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[附源码]计算机毕业设计求职招聘网站Springboot程序

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

Spring框架的介绍、工厂设计模式以及Spring环境的搭建

spring崇尚:不重复的造轮子 二、工厂设计模式 工厂设计模式:工厂生产对象(配置文件properties反射) Spring创建对象的实现原理: 根据配置文件的id得到对应的class属性值,根据反射,通过类全路径创建对象; 通过配置文件,通过工厂设计模式,有反射动态创…

matlab knn方法快速实现,手把手教学

目录介绍话不多说,进入实战注意事项KNN算法的优势和劣势介绍 1968年,Cover和Hart提出K近邻算法。该算法既可以用于回归也可以用于分类,其用于分类时其输入为实例的特征向量,输出为实例的类别。假设给定一个训练数据集&#xff0c…

PsiQuantum宣布在容错量子计算架构方面取得新突破

(图片来源:网络) 12月2日,PsiQuantum宣布了一项突破性技术,该技术将使编译应用程序在运行时效率提高约50倍。可以更有效地实现容错量子计算。 该技术专门针对容错量子计算机的算法,而不是非容错的NISQ系统。…

linux倒序查看占用cpu或内存最多的进程

一、获取当前系统占用CPU最高的前10个进程 命令:ps aux|head -1;ps aux|sort -rn -k3|head -10 该命令组合由2条独立的命令组成: ps aux|head -1:这一句是为了获取标题(USER PID %CPU %MEN VSZ RSS TTY STAT START TIME COMMAND…

儿童学生护眼台灯哪个牌子好?双十二儿童护眼台灯精选

我国儿童以及青少年的近视人数迅速增加,主要是不注意用眼时间,不良好的照明光线,拥有一个明亮舒适的光线环境,能大大减少近视概率,推荐合适的儿童护眼台灯给大家。 TOP1:南卡护眼台灯L1 推荐指数&#xf…

每天一个面试题:ThreadLocal底层原理和实现Demo(12.6.2022)

ThreadLocal底层原理和实现Demo每天一个面试题:ThreadLocal实现ThreadLocal的DemoThreadLocal底层原理为什么ThreadLocalMap的key设计为弱引用今天开始一个新专栏:每天一个面试题系列 也没有拿到令人心动的offer,看来自己学习方式和能力还是差…

霸榜!这本《程序员如何向架构师转型》在Github已持续置顶两月

前言 企业架构在过去十年中取得了长足的进步。随着越来越多新技术出现,充分利用这些因素来将企业架构创建得更好十分重要。通过将新技术集成到企业架构中,即使在困难时期,也能取得丰硕的成果。现代企业架构师的 5 个特征: 1. IT…

PyQt利用QScrollArea+QGridLayout制作一个滑动的Grid布局(QT Designer)

目录前言制作ui文件推送结语前言 有需求需要做一个滑动的Grid布局结构,网上找了很多的文章都是介绍直接用代码去生成的,没有看到用QT Designer做好后再怎么处理,这里研究了一下,以作记录和参考 制作ui文件 新建一个MainWindow 我…

本周推荐 | 基于 canvas 实现 H5 丝滑看图体验

推荐语:随着机器算力及性能的提升,基于原生Web体系的富交互体验也可以媲美原生,本文作者通过Canvas Web手势从零实现了大图浏览的交互效果,并在体验上不输Native,是一次不错的技术尝试,欢迎阅读。——大淘…

家庭宽带相关知识及工具

1.FTTH、FTTR、FTTB FTTH,光纤到户,需要用到光猫,目前主流,最高到千兆(1G),局域网内为网线(超五类、六类等)连接。 FTTR,光纤到房间,或者说是光纤到终端,全光网,最高到万…

技术分享| 音视频与微信小程序互通实践

随着网络架构的变迁、媒体技术发展、音视频场景迭代&#xff0c;基于流媒体的技术也是推陈出新。WebRTC渐渐的成为了音视频互动场景的主流&#xff0c;而微信在6.5.21版本通过小程序开放了实时音视频能力&#xff0c;开发者们可以使用组件 < live-pusher > 实现基于 RTMP…

计讯物联数字乡村解决方案全力助推三农信息化建设

​2020年&#xff0c;中央网信办等七部门联合印发《关于开展国家数字乡村试点工作的通知》。《通知》提出&#xff0c;做好数字乡村发展整体规划设计&#xff0c;统筹推进乡村的新型基础设施、数字经济、数字农业农村、农村科技创新、乡村数字治理、信息惠民服务等建设和发展。…

类的加载过程(类的生命周期)详解

类的加载过程&#xff08;类的生命周期&#xff09;详解 1. 概述 在Java中数据类型分为基本数据类型和引用数据类型。基本数据类型由虚拟机预先定义&#xff0c;引用数据类型则需要进行类的加载。 按照Java虚拟机规范&#xff0c;从class文件到加载到内存中的类&#xff0c;到…

python全局和局部变量以及引用和装饰器

学习笔记 bilibili千峰python global关键字的添加 只有不可变的类型才需要添加global可变的类型不需要添加global不可变类型&#xff1a;当改变变量的值时候&#xff0c;地址发生了改变 类型&#xff1a;int&#xff0c;str&#xff0c;float&#xff0c;bool&#xff0c;tup…

[Spring Boot 6]企业级开发

本节内容主要就几个常用的模块进行解读&#xff0c;在众多企业级开发中常常用得到。 例如邮件发送这一功能其实非常常见&#xff0c;在一般的网站设计中会有对注册邮件的激活功能&#xff0c;此时就需要用到这个功能了&#xff0c;一般来说激活邮件需要设置UUID 来进行验证&…

【Python入门】Python入门必备思维导图,有方向的学习才是最实在的方法

前言 halo&#xff0c;包子们下午好 这篇文章主要是跟大家聊聊我们学习Python该怎么去学习 小编个人认为&#xff0c;学习Python一定要有一个好的学习方向&#xff0c;这样才知道自己该往什么方向去学习 今天小编主要给大家准备了我们学习Python的必备14张思维导图 赶快收藏起…

【SSM整合】SpringMVC + Spring + Mybatis整合详细教程

前言 本文为 SpringMVC Spring Mybatis整合教程 相关详细介绍&#xff0c;从数据库数据准备、相关依赖包添加、创建项目基本结构和配置框架&#xff0c;到Mybatis层的编写、Spring层的编写、SpringMVC层的编写&#xff0c;再到前端页面编写等&#xff0c;最后进行运行与测试&…

新生报到小程序毕业设计,新生报到管理系统设计与实现,毕设作品参考

功能清单 【后台管理员功能】 广告管理&#xff1a;设置小程序首页轮播图广告和链接 留言列表&#xff1a;所有用户留言信息列表&#xff0c;支持删除 录入资讯&#xff1a;录入资讯标题、内容等信息 管理资讯&#xff1a;查看已录入资讯列表&#xff0c;支持删除和修改 学校…

MySQL——表的约束

文章目录表的约束空属性默认值列描述zerofill主键&#x1f60a;自增长唯一键&#x1f60a;外键&#x1f60a;表的约束 真正约束字段的是数据类型&#xff0c;但是数据类型约束很单一&#xff0c;需要有一些额外的约束&#xff0c;更好的保证数据的合法性&#xff0c;从业务逻辑…