【面试宝藏】Go并发编程面试题

深入Go语言并发编程

Go语言以其简洁、高效的并发处理能力而闻名。在Go中,通过各种同步机制和原子操作,可以轻松地实现高性能并发编程。本文将深入探讨Go语言中的并发编程,包括Mutex、RWMutex、Cond、WaitGroup、原子操作等内容。

1. Mutex几种状态

Go语言中的Mutex(互斥锁)有以下几种状态:

  • 未锁定状态:锁当前未被任何goroutine持有。
  • 已锁定状态:锁当前被某个goroutine持有,其他goroutine必须等待。
  • 正常模式:goroutine按先后顺序获取锁。
  • 饥饿模式:锁长时间被某个goroutine持有,其他goroutine获取锁的顺序可能会被打乱,以避免饥饿。
2. Mutex正常模式和饥饿模式
  • 正常模式:Mutex在正常情况下采用FIFO队列来管理等待的goroutine,保证公平性。
  • 饥饿模式:如果一个goroutine等待锁的时间超过1ms,Mutex会进入饥饿模式。此时,等待最久的goroutine会优先获取锁,释放锁的goroutine直接交给等待时间最长的goroutine。
3. Mutex允许自旋的条件

自旋是一种优化策略,允许goroutine在短时间内反复检查锁的状态,而不是立即阻塞。Go的Mutex在以下条件下允许自旋:

  • CPU空闲时。
  • 当前goroutine是最后一个尝试获取锁的goroutine。
4. RWMutex实现

RWMutex(读写互斥锁)允许多个读操作并发执行,但写操作是独占的。其实现原理如下:

  • 使用两个计数器,一个记录当前的读锁数量,一个记录写锁状态。
  • 读锁请求增加读计数器,写锁请求检查读计数器是否为零,再设置写锁状态。
5. RWMutex注意事项

使用RWMutex时需要注意以下事项:

  • 尽量减少锁的持有时间,避免造成性能瓶颈。
  • 防止死锁,确保锁的获取和释放顺序一致。
  • 不要在读锁持有期间尝试获取写锁,这样会导致死锁。
6. Cond是什么

Cond(条件变量)用于goroutine之间的通知机制。它包含一个锁和一个等待队列,主要用于协调共享资源的访问。Cond提供了以下方法:

  • Wait(): 等待条件满足,释放锁并阻塞当前goroutine。
  • Signal(): 唤醒一个等待中的goroutine。
  • Broadcast(): 唤醒所有等待中的goroutine。
7. Broadcast和Signal区别
  • Broadcast:唤醒所有等待条件变量的goroutine。
  • Signal:仅唤醒一个等待条件变量的goroutine。
8. Cond中Wait使用

使用Cond的Wait方法时,一般的步骤如下:

  1. 先获取锁。
  2. 检查条件是否满足,如果不满足调用Wait()
  3. Wait()中,释放锁并阻塞当前goroutine,直到被唤醒。
  4. 被唤醒后重新获取锁并继续执行。

示例代码:

var mu sync.Mutex
var cond = sync.NewCond(&mu)mu.Lock()
for !condition {cond.Wait()
}
mu.Unlock()
9. WaitGroup用法

WaitGroup用于等待一组goroutine完成。主要方法有:

  • Add(delta int): 增加等待计数。
  • Done(): 减少等待计数,通常在goroutine中调用。
  • Wait(): 阻塞直到等待计数为零。

示例代码:

var wg sync.WaitGroup
wg.Add(1)
go func() {defer wg.Done()// 执行任务
}()
wg.Wait()  // 等待所有任务完成
10. WaitGroup实现原理

WaitGroup通过一个计数器来跟踪goroutine的数量。Add方法增加计数器,Done方法减少计数器,Wait方法阻塞直到计数器归零。

11. 什么是sync.Once

sync.Once确保指定的操作只执行一次,通常用于单例模式。主要方法是Do,它接收一个函数并在第一次调用时执行,后续调用不再执行。

示例代码:

var once sync.Once
once.Do(func() {// 只执行一次的代码
})
12. 什么操作叫做原子操作

原子操作是指不可分割的操作,确保在多线程环境下操作的完整性,不会被中断。Go提供了sync/atomic包来实现基本的原子操作,如加载、存储、交换、比较和交换等。

13. 原子操作和锁的区别
  • 原子操作:提供更细粒度的并发控制,无需上下文切换,性能更高,适用于简单的变量读写。
  • :提供更广泛的并发控制,适用于复杂的共享资源管理,但可能导致上下文切换,性能较低。
14. 什么是CAS

CAS(Compare-And-Swap)是一种原子操作,用于实现无锁算法。CAS操作比较内存中的值与预期值,如果相等则交换为新值,返回是否交换成功。

示例代码:

var value int32
atomic.CompareAndSwapInt32(&value, oldValue, newValue)
15. sync.Pool有什么用

sync.Pool是一个并发安全的对象池,用于缓存和重用临时对象,减少内存分配和垃圾回收的开销。适用于高频率创建和销毁对象的场景。

示例代码:

var pool = sync.Pool{New: func() interface{} {return &Object{}},
}obj := pool.Get().(*Object)
pool.Put(obj)

通过对以上内容的详细解答,希望您对Go语言的并发编程有了更深入的理解和掌握。这些知识不仅是面试中的高频考点,也是实际开发中提升并发性能的关键。

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

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

相关文章

普华永道信任危机:上市公司解约风波与反思

在全球会计业界的星空中,普华永道无疑是那颗最为耀眼的星之一。然而,近日这颗星却遭遇了前所未有的信任危机。这家大名鼎鼎的四大会计师事务所之一,近期陷入了上市公司解约的风波之中,其声誉与地位正面临严峻挑战。 就在昨晚&…

没有WebSecurityConfigurerAdapter的Spring Security

没有WebSecurityConfigurerAdapter的Spring Security 最近一直在从springboot2.x向3.x学习迁移,付出了很大的学习成本,心得会不断分享。对于spring security来说,是该和WebSecurityConfigurerAdapter说再见了,因为在Spring Secur…

Vivado的两种下载安装方式:Webpack下载与安装、本地文件安装详细步骤讲解

目录 1.前言2. Vivado Webpack下载、安装3.本地文件下载安装 微信公众号获取更多FPGA相关源码: 1.前言 本人自本科大二开始接触FPGA相关知识,现已将近六年,由于一直在上学,也不是一直在搞FPGA,但是也完成过一些项目…

【学习】企业如何选择一个合适的DCMM咨询机构

DCMM是我国首个数据管理领域正式发布的国家标准。旨在帮助企业利用先进的数据管理理念和方法,建立和评价自身数据管理能力,持续完善数据管理组织、程序和制度,充分发挥数据在促进企业向信息化、数字化、智能化发展方面的价值。该标准借鉴了国…

数据仓库核心:维度表设计的艺术与实践

文章目录 1. 引言1.1基本概念1.2 维度表定义 2. 设计方法2.1 选择或新建维度2.2 确定维度主维表2.3 确定相关维表2.14 确定维度属性 3. 维度的层次结构3.1 举个例子3.2 什么是数据钻取?3.3 常见的维度层次结构 4. 高级维度策略4.1 维度整合维度整合:构建…

IDEA 学习之 疑难杂症系列

IDEA 学习之 疑难杂症系列 1. Mapstruct 编译空指针问题 1.1. 现象 NullPointerException at org.mapstruct.ap.internal.processor.DefaultVersionInformation.createManifest1.2. 原因 MapStruct 在 IDEA 2020.3 版本编译 NPE 问题 1.3. 解决办法 2. IDEA 学习之 编译内…

python列表的进阶

小结: # 列表的删除小结: # 删除列表的最后一列 punished students.pop() print(被罚站的人是: punished ,同学们引以为戒。)# 根据下标删除 del students[0]#根据名称删除 students.remove(王熙凤)在今天的课程里&#xff0c…

绿联 安装SeaTable在线协同表格

绿联 安装SeaTable在线协同表格 1、镜像 seatable/seatable-developer:latest 2、安装 2.1、基础设置 重启策略:容器退出时总是重启容器。 2.2、网络 网络选择桥接(bridge)。 2.3、存储空间 装载路径/shared不可变更。 2.4、端口设置 容器端口固定80&#x…

Unity动画系统介绍

Unity动画系统介绍 Animator组件: 这是Unity中用于控制动画状态的组件,它与Animator Controller一起工作,可以基于游戏逻辑来切换不同的动画状态。 Animator Controller: 这是一个用于管理动画状态机的组件,它允许…

Leetcode:回文数

题目链接&#xff1a;9. 回文数 - 力扣&#xff08;LeetCode&#xff09; 普通版本&#xff08;字符串双指针&#xff09; 1、x为负数时永远不可能为回文数 2、x为个位数时不可能是回文数 class Solution { public:bool isPalindrome(int x) {if(x<0||(x%100 &&…

服务器硬件的基础知识

服务器硬件的基础知识 服务器硬件是服务器计算机的物理组件&#xff0c;用于存储、处理和管理数据。以下是服务器硬件的基础知识介绍。 1. 处理器&#xff08;CPU&#xff09; 概述 处理器是服务器的核心组件&#xff0c;负责执行计算和处理任务。常见品牌有 Intel 和 AMD。…

音视频开发—V4L2介绍,FFmpeg 打开摄像头输出yuv文件

实验平台&#xff1a;Ubuntu20.04 摄像头&#xff1a;1080P 监控摄像头&#xff0c;采用V4L2驱动框架 文章目录 1.V4L2相关介绍1.1. 基本概念1.2. 主要功能1.3. V4L2驱动框架1.4. 主要组件1.5. 使用V4L2的应用1.6. 常用V4L2工具 2.ffmpeg命令实现打开摄像头输出yuv文件3.使用C…

刷题笔记1:如何科学的限制数字溢出问题

LCR 192. 把字符串转换成整数 (atoi) - 力扣&#xff08;LeetCode&#xff09; 我们以力扣的此题目为例&#xff0c;简述在诸如大数运算等问题中如何限制数字溢出问题。 先来直接看看自己的处理方式&#xff1a; class Solution { public:int myAtoi(string str) {int pcur0;…

【文末附gpt升级秘笈】iOS 18首个正式版与AI Siri的缺席:技术迭代与用户期待之间的博弈

iOS 18首个正式版与AI Siri的缺席&#xff1a;技术迭代与用户期待之间的博弈 摘要 随着人工智能技术的飞速发展&#xff0c;智能语音助手已成为移动设备的重要功能之一。作为移动操作系统的领导者&#xff0c;苹果的iOS系统一直以其稳定性和创新性著称。然而&#xff0c;在iO…

ssm整合(spring+springmvc+mybatis)做一个小项目(SpringMVC学习笔记六)

一、mybatis层 1、搭建数据库&#xff1a; //创建数据库 CREATE DATABASE ssmbuild; //选择数据库 USE ssmbuild//检查如果数据库中有books这个表的话就给他删除 DROP TABLE IF EXISTS books//创建表books CREATE TABLE books( bookID INT(10) NOT NULL AUTO_INCREMENT COMME…

二叉树链式结构的实现

1.创建二叉树 (1)创建结构体 typedef int BTDataType;typedef struct BinaryTreeNode {BTDataType _data;struct BinaryTreeNode* _left;struct BinaryTreeNode* _right; }BTNode;(2)根据前序遍历构建树 //通过前序遍历的数组"123##45##6##"构建二叉树 BTNode* Bi…

vue组合式和选项式

Vue中的组合式(Composition API)和选项式(Options API)是两种不同的编写组件逻辑的方法。 组合式API&#xff08;Composition API&#xff09;: 使用函数来定义组件逻辑&#xff0c;可以更灵活地重用和组合逻辑。使用setup函数作为组件的入口点&#xff0c;在这里可以访问pro…

docker以挂载目录启动容器报错问题的解决

拉取镜像&#xff1a; docker pull elasticsearch:7.4.2 docker pull kibana:7.4.2 创建实例&#xff1a; mkdir -p /mydata/elasticsearch/configmkdir -p /mydata/elasticsearch/dataecho "http.host: 0.0.0.0" >> /mydata/elasticsearch/config/elasti…

vs2019 c++20 规范 STL库中关于时间的模板 ratio<T,U> , duration<T,U> , time_point<T,U>等

(探讨一)在学习线程的时候&#xff0c;一些函数会让线程等待或睡眠一段时间。函数形参是时间单位&#xff0c;那么在 c 中是如何记录和表示时间的呢&#xff1f;以下给出模板简图&#xff1a; &#xff08;2 探讨二&#xff09;接着给出对模板类 duration_values 的成员函数的测…

【Leetcode 705 】设计哈希集合——数组嵌套链表(限制哈希Key)

题目 不使用任何内建的哈希表库设计一个哈希集合&#xff08;HashSet&#xff09;。 实现 MyHashSet 类&#xff1a; void add(key) 向哈希集合中插入值 key 。bool contains(key) 返回哈希集合中是否存在这个值 key 。void remove(key) 将给定值 key 从哈希集合中删除。如果…