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

news2024/11/20 15:38:41

  ✍个人博客:Pandaconda-CSDN博客

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

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

 52. Go channel 为什么是线程安全的?

Go channel 是线程安全的,原因在于 channel 内部实现了同步机制,它可以保证在多个 goroutine 之间的同步和互斥访问。

具体来说,Go channel 内部实现了两个重要的操作:发送和接收。当一个 goroutine 向一个 channel 发送数据时,如果 channel 已满,那么发送操作会被阻塞,直到 channel 中有足够的空间。同样地,当一个 goroutine 从一个 channel 接收数据时,如果 channel 已空,那么接收操作也会被阻塞,直到 channel 中有新的数据可供接收。

这种阻塞式的操作可以保证 channel 在多个 goroutine 之间的同步和互斥访问,从而避免了多个 goroutine 同时对同一个变量进行修改的竞争条件(race condition)问题。而在 Go 语言中,对于同一个变量的竞争条件问题是需要通过同步机制来解决的。

因此,通过使用 channel,我们可以很方便地实现多个 goroutine 之间的数据交换和同步,而不必担心竞争条件问题。同时,Go channel 还具有一些其他的优点,例如可以实现单向通信、支持多路复用、可用于控制流等。

53. Go channel 如何控制 goroutine 并发执行顺序?

Go channel 可以用于控制 goroutine 的并发执行顺序。具体来说,我们可以利用 channel 的阻塞特性来控制 goroutine 的执行顺序。

比如,我们可以创建一个带缓冲的 channel,并在 goroutine 中向该 channel 中发送数据。当缓冲区已满时,该 goroutine 会被阻塞,直到有其他 goroutine 从 channel 中接收数据,释放出缓冲区空间为止。这样,我们就可以利用 channel 的缓冲区大小来控制 goroutine 的并发执行数量。

另外,我们还可以使用无缓冲的 channel 来控制 goroutine 的执行顺序。具体来说,我们可以利用 channel 的阻塞特性和同步机制来保证 goroutine 的有序执行。

比如,我们可以创建两个 goroutine,其中一个 goroutine 向一个无缓冲的 channel 发送数据,另一个 goroutine 从该 channel 中接收数据,当该 channel 中有数据时,才会执行该 goroutine。这样,我们就可以保证第一个 goroutine 先执行,并将数据发送到 channel 中,然后第二个 goroutine 才能执行,并从该 channel 中接收数据。

下面是一个简单的示例代码,演示了如何使用 channel 控制 goroutine 的执行顺序:

package main
import (
    "fmt"
    "time"
)
func main() {
    ch := make(chan bool)
    go func() {
        fmt.Println("goroutine1")
        ch <- true
    }()
    <-ch
    go func() {
        fmt.Println("goroutine2")
        ch <- true
    }()
    <-ch
    fmt.Println("main goroutine")
}

在上面的代码中,我们创建了一个无缓冲的 channel,分别创建了两个 goroutine,并在第一个 goroutine 执行完成后,再执行第二个 goroutine。最后,我们在主 goroutine 中输出了一条信息,表示整个程序的执行已经结束。

 54. Go channel 共享内存有什么优劣势?

  

Go channel 通过共享内存的方式来实现 goroutine 之间的通信,这种方式相对于传统的锁和信号量等同步原语来说,具有一些优点和缺点。

优点:

  1. 高效:相对于传统的锁和信号量等同步原语,使用 channel 实现并发控制更加高效,因为 channel 本身就是一种高效的并发原语。

  2. 可以减少死锁和竞态条件:由于 channel 的特性,即只能有一个 goroutine 在读取或写入数据,所以可以避免出现死锁和竞态条件等并发问题。

  3. 安全性高:channel 作为一种线程安全的并发原语,可以确保在 goroutine 之间共享数据时,数据不会被意外篡改或损坏。

缺点:

  1. 内存占用高:使用 channel 共享内存时,需要占用一定的内存空间来存储数据,当数据量较大时,会占用较多的内存。

  2. 传输数据类型受限:channel 只能传输固定类型的数据,不支持传输复杂的数据结构,如函数、接口等。

  3. 难以调试:由于 channel 的异步特性,当出现并发问题时,难以排查和调试。

因此,在实际应用中,我们需要权衡使用 channel 和传统同步原语的优缺点,根据实际情况来选择合适的并发控制方式。一般来说,当需要传输简单类型的数据时,使用 channel 的优势更加明显,而当需要传输复杂的数据类型或者控制复杂的并发逻辑时,使用传统同步原语可能更为适合。

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

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

相关文章

算法:BFS 解决拓扑排序

目录 拓扑排序 题目一&#xff1a;课程表 题目二&#xff1a;课程表II 题目三&#xff1a;火星词典 拓扑排序 有向无环图(DAG图) 有向无环图也就是有几个点&#xff0c;每个点之间的线段都是有向的&#xff0c;且任意拿出来几个点&#xff0c;都是无环的&#xff0c;这里…

Adaboost集成学习 | Matlab实现基于ELM-Adaboost极限学习机结合Adaboost集成学习故障诊断

目录 效果一览基本介绍程序设计参考资料效果一览 基本介绍 Adaboost集成学习 | Matlab实现基于ELM-Adaboost极限学习机结合Adaboost集成学习故障诊断 ELM(Extreme Learning Machine)和 Adaboost 都是机器学习领域中常见的算法。ELM 是一种单隐层前馈神经网络,具有快速训练、…

使用 1panel面板 部署 springboot 和 vue

代码仓库&#xff1a;还没弄 目录 网站介绍安装步骤1. 准备云服务器2. 准备域名&#xff08;可跳过&#xff09;3. 安装1panel面板4. 服务器开放端口5. 进入1panel面板6. 安装并启动软件&#xff08;服务器和面板开放端口&#xff09;7. 打包并上传项目7.1 打包 Java项目&#…

算力共享中神经网络切片和算力分配策略

目录 神经网络切片 按照算力的分布进行网络层数切片;就是算力越强,运算神经网络层数越多 神经网络切片和算力占比进行映射 算力分配策略 get_current_shard 神经网络切片 按照算力的分布进行网络层数切片;就是算力越强,运算神经网络层数越多 神经网络切片和算力占比进…

基于RK3588+AI支持能源在线监测系统应用的AIOT产品方案

支持能源在线监测系统应用的AIOT产品方案 近年来&#xff0c;智慧能源行业受益于国家政策扶持、市场需求拉动和先进技术支撑呈现出了蓬勃发展态势。助推智慧能源发展&#xff0c;打造了支持能源在线监测系统应用的AIOT产品方案。 能源在线监测系统的市场潜力 随着社会经济的飞…

C++笔记---类和对象(中)

1. 类的默认成员函数 默认成员函数就是用户没有显式实现&#xff0c;编译器会自动生成的成员函数称为默认成员函数。 一个类&#xff0c;我们不写的情况下编译器会默认生成以下6个默认成员函数&#xff0c;分别为&#xff1a;构造函数&#xff0c;析构函数&#xff0c;拷贝构…

【Java】Java swing 民宿管理系统 GUI(源码+可视化界面)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

【vulnhub】W1R3S.inc靶机

靶机安装 下载地址&#xff1a;https://download.vulnhub.com/w1r3s/w1r3s.v1.0.1.zip 运行环境&#xff1a;vmware 信息收集 靶机发现IP扫描 nmap 192.168.93.0/24 端口扫描,发现开放21、22、80、3306端口 nmap -A 192.168.93.159 -p- 进行目录扫描 dirsearach -u http…

函数实例讲解(三)

文章目录 常用的三个数学函数1、绝对值函数ABS2、取整数部分INT3、求余数函数MOD 求极值函数max、min1、Max2、Min 附加条件下求平均数1、AVERAGE2、AVERAGEIF3、AVERAGEIFS VLOOKUP与COLUMN1、VLOOKUP2、COLUMN 查找函数LOOKUP1、基础语法2、向量形式3、数组形式 常用的三个数…

Odoo生产执行(MES)系统管理解决方案简介

什么是生产执行管理解决方案&#xff1f; Odoo生产执行管理解决方案可以在统一平台上集成诸如生产调度、产品跟踪、质量控制、设备故障分析、网络报表等管理功能&#xff0c;使用统一的数据库和通过网络联接可以同时为生产部门、质检部门、工艺部门、物流部门等提供车间管理信息…

windows 部署 mindspore GPU 开发环境(WSL)

基础环境 windows 环境&#xff1a; Windows 10 版本&#xff1a;22H2 操作系统版本&#xff1a;22621.2283 WSL 系统 版本&#xff1a;2.2.4.0 Ubuntu-20.04 一、自定义位置安装Ubuntu 确保已经安装 WSL 在微软应用商店搜索时务必输入全名 Ubuntu20.04&#xff0c;并安装…

LLM:SGD、adam

SGD没有一阶和二阶动量。adam是融合了这两种动量。 参考&#xff1a;https://blog.csdn.net/yinyu19950811/article/details/90476956 【十分钟搞明白Adam和AdamW&#xff0c;SGD&#xff0c;Momentum&#xff0c;RMSProp&#xff0c;Adam&#xff0c;AdamW】

【window10/window11】解决任务管理器有进程无法强制结束情况

以管理员身份启动控制台窗体&#xff0c;然后从任务管理器中查询到你要结束的进程名&#xff0c;然后运行以下命令&#xff08;UniAccessAgent.exe替换成你要结束的进程&#xff09;&#xff1a; wmic process where nameUniAccessAgent.exe delete 此方法可以解决在任务管理…

微软蓝屏事件揭示的网络安全深层问题与未来应对策略

目录 微软蓝屏事件揭示的网络安全深层问题与未来应对策略 一、事件背景 二、事件影响 2.1、跨行业连锁反应 2.2、经济损失和社会混乱 三、揭示的网络安全问题 3.2、软件更新管理与风险评估 3.2、系统复杂性与依赖关系 3.3、网络安全意识与培训 四、未来的网络安全方向…

LSPatch制作内置模块应用软件无需root 教你制作内置应用

前言 LSPatch功能非常强大&#xff0c;它是一款基于LSPosed核心的免Root Xposed框架软件。这意味着用户无需进行手机root操作&#xff0c;即可轻松植入内置Xposed模块&#xff0c;享受更多定制化的功能和体验&#xff0c;比如微某内置模块版等&#xff0c;这为那些不想root手机…

分享一个基于Spring Boot的在线智慧考公学习管理系统(源码、调试、LW、开题、PPT)

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人 八年开发经验&#xff0c;擅长Java、Python、PHP、.NET、Node.js、Android、微信小程序、爬虫、大数据、机器学习等&#xff0c;大家有这一块的问题可以一起交流&…

【Vue3】组件通信之provideinject

【Vue3】组件通信之provide&inject 背景简介开发环境开发步骤及源码总结 背景 随着年龄的增长&#xff0c;很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来&#xff0c;技术出身的人总是很难放下一些执念&#xff0c;遂将这些知识整理成文&#xff0c;以纪念曾经努…

一款好用的开源网站内容管理系统

今天给大家介绍的是一款开源网站内容管理系统&#xff08;灵活、易用&#xff0c;性能良好、运行稳定&#xff0c;轻松管理建设网站&#xff09; 官网&#xff1a;https://www.ujcms.com/ 介绍 客户端兼容Edge&#xff08;Chromium版&#xff09;、谷歌浏览器&#xff08;Chro…

Mybatis实战:图书管理系统(笔记)

前言&#xff1a;如果在接口的声明方法中鼠标右键没有Test的单元测试。 你的鼠标光标问题&#xff1a;要在花括号范围内&#xff01;&#xff01;&#xff01;&#xff01; 数据库表是应⽤程序开发中的⼀个重要环节, 数据库表的设计往往会决定我们的应⽤需求是否能顺利实现, 甚…

数据湖和数据仓库核心概念与对比

随着近几年数据湖概念的兴起&#xff0c;业界对于数据仓库和数据湖的对比甚至争论就一直不断。有人说数据湖是下一代大数据平台&#xff0c;各大云厂商也在纷纷的提出自己的数据湖解决方案&#xff0c;一些云数仓产品也增加了和数据湖联动的特性。但是数据仓库和数据湖的区别到…