【面试宝藏】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方法时,一般的步骤如下:
- 先获取锁。
- 检查条件是否满足,如果不满足调用
Wait()。 - 在
Wait()中,释放锁并阻塞当前goroutine,直到被唤醒。 - 被唤醒后重新获取锁并继续执行。
示例代码:
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语言的并发编程有了更深入的理解和掌握。这些知识不仅是面试中的高频考点,也是实际开发中提升并发性能的关键。
相关文章:
【面试宝藏】Go并发编程面试题
深入Go语言并发编程 Go语言以其简洁、高效的并发处理能力而闻名。在Go中,通过各种同步机制和原子操作,可以轻松地实现高性能并发编程。本文将深入探讨Go语言中的并发编程,包括Mutex、RWMutex、Cond、WaitGroup、原子操作等内容。 1. Mutex几…...
④单细胞学习-cellchat细胞间通讯
目录 1,原理基础 流程 受体配体概念 方法比较 计算原理 2,数据 3,代码运行 1,原理基础 原文学习Inference and analysis of cell-cell communication using CellChat - PMC (nih.gov) GitHub - sqjin/CellChat: R toolk…...
即时通讯平台及门户系统WorkPlus打造移动应用管理平台
在全球化和数字化时代,企业管理和沟通的方式正发生着巨大的变化。为了实现高效的协作和资源共享,企业越来越倾向于使用即时通讯及门户系统。这两种系统结合起来,可以提供一套完整的沟通和信息发布平台,促进内部协作和信息管理。 …...
React@16.x(12)ref 转发-forwardRef
目录 1,介绍2,类组件如何使用4,应用场景-高阶组件HOC 1,介绍 上篇文章中提到,ref 只能对类组件使用,不能对函数组件使用。 而 ref 转发可以对函数组件实现类似的功能。 使用举例: import Re…...
电脑世界的大冒险:用人体比喻让孩子轻松理解电脑20240603
电脑世界的大冒险:用人体比喻让孩子轻松理解电脑 作为一名在IT行业的老程序猿,我见证了电脑技术的飞速发展,也亲身体验了科技给生活带来的翻天覆地的变化。然而,在这个日新月异的数字时代,我意识到,与孩子…...
构建智慧银行保险系统的先进技术架构
随着科技的不断发展,智慧银行保险系统正日益受到关注。在这个数字化时代,构建一个先进的技术架构对于智慧银行保险系统至关重要。本文将探讨如何构建智慧银行保险系统的先进技术架构,以提升服务效率、降低风险并满足客户需求。 ### 1. 智慧银…...
来自大厂硬盘的降维打击!当希捷酷玩520 1TB SSD卷到369,请问阁下该怎么应对?
来自大厂硬盘的降维打击!当希捷酷玩520 1TB SSD卷到369,请问阁下该怎么应对? 哈喽小伙伴们好,我是Stark-C~ 今年4月份的时候因为电脑上的游戏盘突然挂掉,为了性价比选购了希捷酷玩520 1TB SSD,同时我也是…...
什么是封装?为什么是要封装?
封装是面向对象编程中的一种核心概念,它是将数据和操作数据的方法结合起来,形成一个整体,对外只暴露必要的接口,隐藏内部的具体实现细节。 封装的目的是为了实现信息隐藏和代码的模块化,具体原因如下: 1.…...
Spring Cloud | 服务 “注册与发现“ 框架 : Eureka框架
目录: Eureka 的 "工作机制" :一、Eureka 的 "工作原理" ( 两大组件 ) :1.1 Eureka Server ( 服务注册中心 )1.2 Eureka Client ( 服务/服务实例,其存在 "两种角色" : ①服务提供者 ②服务消费者 ) :Eureka Client 的 含义…...
编译链接问题
问题描述 C语言在编译的时候,提示链接的时候没有找到相应的方法 问题分析 代码文件结构: test.c test/1.c test/1.h test.c代码: #include “test/1.h” void main() { hello(); } test/1.c代码: void hello() { printf(“hel…...
电涡流的形成范围
电涡流的形成范围涉及多个方面,主要受到导体材料、磁场变化速度、导体形状和尺寸以及磁场方向的影响。以下是对这些因素的详细分析: 导体材料:金属和合金是最容易产生电涡流的材料,而非金属材料(如陶瓷、塑料等&#…...
学业辅导导师:文心一言智能体详细介绍和开发
一、前言 本期题目 开发方向:学习成长类 解读: AI技术在学习成长方向的应用正日益增多,本期赛题需围绕该方向开发智能体包括但不限于:作文辅导助手、个性化学习助手、考试助手、各垂类教育内容专家等 二、我的智能体:学业辅导…...
AI与NLP的完美结合:揭秘ChatGPT
AI与NLP的完美结合:揭秘ChatGPT 一、AI大模型的发展历程 AI大模型的发展可追溯到早期的深度学习技术。深度学习通过多层神经网络处理复杂的数据模式,显著提升了图像识别、语音识别等领域的性能。随后,研究人员将注意力转向NLP,开…...
提交一个Bug需要哪些信息?
软件在使用过程中存在的任何问题都叫做软件的缺陷,简称Bug,我认为要提交一个Bug首先得将这个Bug的核心内容说明一下,比如Bug的核心问题是什么、产生的前提、预期结果是什么、但实际结果是什么、以及附上一个证据图片。 然后提交时需要Bug报告…...
【Hive SQL 每日一题】统计每月用户购买商品的种类分布
文章目录 测试数据需求说明需求实现 测试数据 -- 创建 orders 表 DROP TABLE IF EXISTS orders; CREATE TABLE orders (order_id INT,user_id INT,product_id INT,order_date STRING );-- 插入 orders 数据 INSERT INTO orders VALUES (101, 1, 1001, 2023-01-01), (102, 1, 1…...
Nginx01-HTTP简介与Nginx简介(安装、命令介绍、目录介绍、配置文件介绍)
目录 HTTP简介HTTP原理查看访问网站的详细流程curl -vwget --debug 查看网站访问量HTTP协议版本HTTP协议交互HTTP 请求请求报文起始行请求头 HTTP响应响应报文起始行响应头 Nginx常见的Web服务常见网站服务 安装NginxNginx目录结构Nginx启动管理Nginx常用命令 Nginx配置文件主配…...
JAVA: 抽象类和接口
Java中可以可以定义不含方法体的方法,方法的方法体由其所在类的子类根据实际需求去实现,这样的方法称为抽象方法(Abstract Method),包含抽象方法的类必须是抽象类(Abstract Class)。 抽象方法和…...
风景的短视频一分钟:成都科成博通文化传媒公司
风景的短视频一分钟:时光凝固的画卷 在快节奏的现代生活中,我们常常被繁忙和琐碎所困扰,渴望在喧嚣中找到一丝宁静与美好。而风景的短视频,正是这样一份能够让我们在短时间内沉浸于自然之美的奇妙礼物。成都科成博通文化传媒公司…...
力扣--双指针15.三数之和
详细思路 排序数组:首先对数组 nums 进行排序,目的是为了方便后续使用双指针查找和避免重复结果。遍历数组:使用一个 for 循环从头遍历到倒数第三个元素。i 表示当前固定的元素。 跳过重复元素:如果当前元素 nums[i] 与前一个元素…...
C++ A (1020) : 幂运算
文章目录 一、题目描述二、参考代码 一、题目描述 二、参考代码 #include<bits/stdc.h> using namespace std; typedef long long ll;void qq(ll a, ll b, ll m) {if (a 0) cout << 0 << endl;;ll out 1;a % m;while (b > 0){if (b & 1)//奇数的最…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)
HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...
对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...
CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...
Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)
在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...
Java + Spring Boot + Mybatis 实现批量插入
在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法:使用 MyBatis 的 <foreach> 标签和批处理模式(ExecutorType.BATCH)。 方法一:使用 XML 的 <foreach> 标签ÿ…...
代码规范和架构【立芯理论一】(2025.06.08)
1、代码规范的目标 代码简洁精炼、美观,可持续性好高效率高复用,可移植性好高内聚,低耦合没有冗余规范性,代码有规可循,可以看出自己当时的思考过程特殊排版,特殊语法,特殊指令,必须…...
通过 Ansible 在 Windows 2022 上安装 IIS Web 服务器
拓扑结构 这是一个用于通过 Ansible 部署 IIS Web 服务器的实验室拓扑。 前提条件: 在被管理的节点上安装WinRm 准备一张自签名的证书 开放防火墙入站tcp 5985 5986端口 准备自签名证书 PS C:\Users\azureuser> $cert New-SelfSignedCertificate -DnsName &…...
Docker拉取MySQL后数据库连接失败的解决方案
在使用Docker部署MySQL时,拉取并启动容器后,有时可能会遇到数据库连接失败的问题。这种问题可能由多种原因导致,包括配置错误、网络设置问题、权限问题等。本文将分析可能的原因,并提供解决方案。 一、确认MySQL容器的运行状态 …...
Modbus RTU与Modbus TCP详解指南
目录 1. Modbus协议基础 1.1 什么是Modbus? 1.2 Modbus协议历史 1.3 Modbus协议族 1.4 Modbus通信模型 🎭 主从架构 🔄 请求响应模式 2. Modbus RTU详解 2.1 RTU是什么? 2.2 RTU物理层 🔌 连接方式 ⚡ 通信参数 2.3 RTU数据帧格式 📦 帧结构详解 🔍…...
