当前位置: 首页 > news >正文

【Golang 面试 - 进阶题】每日 3 题(一)

✍个人博客:Pandaconda-CSDN博客

📣专栏地址:http://t.csdnimg.cn/UWz06

📚专栏简介:在这个专栏中,我将会分享 Golang 面试中常见的面试题给大家~
❤️如果有收获的话,欢迎点赞👍收藏📁,您的支持就是我创作的最大动力💪

1. Mutex 有几种状态?

  • mutexLocked — 表示互斥锁的锁定状态;

  • mutexWoken — 表示从正常模式被从唤醒;

  • mutexStarving — 当前的互斥锁进入饥饿状态;

  • waitersCount — 当前互斥锁上等待的 Goroutine 个数;

2. Mutex 正常模式和饥饿模式

正常模式(非公平锁)

正常模式下,所有等待锁的 goroutine 按照 FIFO(先进先出)顺序等待。唤醒的 goroutine 不会直接拥有锁,而是会和新请求 goroutine 竞争锁。新请求的 goroutine 更容易抢占:因为它正在 CPU 上执行,所以刚刚唤醒的 goroutine有很大可能在锁竞争中失败。在这种情况下,这个被唤醒的 goroutine 会加入到等待队列的前面。

饥饿模式(公平锁)

为了解决了等待 goroutine 队列的长尾问题。

饥饿模式下,直接由 unlock 把锁交给等待队列中排在第一位的 goroutine (队头),同时,饥饿模式下,新进来的 goroutine 不会参与抢锁也不会进入自旋状态,会直接进入等待队列的尾部。这样很好的解决了老的 goroutine 一直抢不到锁的场景。

饥饿模式的触发条件:当一个 goroutine 等待锁时间超过 1 毫秒时,或者当前队列只剩下一个 goroutine 的时候,Mutex 切换到饥饿模式。

总结

对于两种模式,正常模式下的性能是最好的,goroutine 可以连续多次获取锁,饥饿模式解决了取锁公平的问题,但是性能会下降,这其实是性能和公平的一个平衡模式。

3. Mutex 允许自旋的条件

  • 锁已被占用,并且锁不处于饥饿模式。

  • 积累的自旋次数小于最大自旋次数(active_spin = 4)。

  • CPU 核数大于 1。

  • 有空闲的 P。

  • 当前 Goroutine 所挂载的 P 下,本地待运行队列为空。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • WordPress原创插件:启用关闭经典编辑器和小工具
  • 力扣刷题----42. 接雨水
  • 【图像处理】不智能的目标识别
  • C语言 | Leetcode C语言题解之第279题完全平方数
  • 大型语言模型LLM的核心概念
  • 【数据结构】线性表与顺序表
  • Ubuntu22.04使用NVM安装多版本Node.js和版本切换
  • RedisTemplate、StringRedisTemplate、序列化器配置
  • Django REST Framework(十四)路由Routes
  • 二十四、【机器学习】【非监督学习】- 高斯混合模型 (Gaussian Mixture Models, GMM)
  • 深入理解 Redis 的使用与监控
  • 移动UI:排行榜单页面如何设计,从这五点入手,附示例。
  • 【DP】01背包
  • Linux嵌入书学习—数据结构——栈(seqstak)
  • 鸿蒙(HarmonyOS)下拉选择控件
  • 【翻译】babel对TC39装饰器草案的实现
  • canvas 高仿 Apple Watch 表盘
  • Cumulo 的 ClojureScript 模块已经成型
  • ES6 学习笔记(一)let,const和解构赋值
  • Java|序列化异常StreamCorruptedException的解决方法
  • Koa2 之文件上传下载
  • Laravel Mix运行时关于es2015报错解决方案
  • leetcode46 Permutation 排列组合
  • log4j2输出到kafka
  • PAT A1092
  • underscore源码剖析之整体架构
  • 大主子表关联的性能优化方法
  • 高性能JavaScript阅读简记(三)
  • 汉诺塔算法
  • 开发了一款写作软件(OSX,Windows),附带Electron开发指南
  • 如何设计一个比特币钱包服务
  • 如何用Ubuntu和Xen来设置Kubernetes?
  • 数据可视化之 Sankey 桑基图的实现
  • 详解NodeJs流之一
  • 06-01 点餐小程序前台界面搭建
  • 阿里云ACE认证学习知识点梳理
  • ​flutter 代码混淆
  • ​HTTP与HTTPS:网络通信的安全卫士
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • #define用法
  • #我与Java虚拟机的故事#连载04:一本让自己没面子的书
  • (10)Linux冯诺依曼结构操作系统的再次理解
  • (代码示例)使用setTimeout来延迟加载JS脚本文件
  • (读书笔记)Javascript高级程序设计---ECMAScript基础
  • (附源码)ssm高校升本考试管理系统 毕业设计 201631
  • (附源码)ssm教师工作量核算统计系统 毕业设计 162307
  • (一)Neo4j下载安装以及初次使用
  • (转)从零实现3D图像引擎:(8)参数化直线与3D平面函数库
  • (转载)(官方)UE4--图像编程----着色器开发
  • .form文件_一篇文章学会文件上传
  • .NET : 在VS2008中计算代码度量值
  • .Net Core和.Net Standard直观理解
  • .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)
  • .NetCore Flurl.Http 升级到4.0后 https 无法建立SSL连接
  • .NetCore 如何动态路由