【Golang 面试题】每日 3 题(四十一)

ops/2025/1/23 11:46:07/

✍个人博客:Pandaconda-CSDN博客
📣专栏地址:http://t.csdnimg.cn/UWz06
📚专栏简介:在这个专栏中,我将会分享 Golang 面试中常见的面试题给大家~
❤️如果有收获的话,欢迎点赞👍收藏📁,您的支持就是我创作的最大动力💪

121. 什么是 CAS?

CAS,即 Compare-And-Swap,是一种常见的并发控制机制,也是原子操作的一种。它用于实现在多个线程并发修改同一数据时的同步和互斥访问,是实现锁、并发队列等数据结构的基础。

CAS 操作需要三个参数:内存地址 V,期望值 A 和新值 B。CAS 操作的执行过程如下:

  1. 比较内存地址 V 中存储的值与期望值 A 是否相等;
  2. 如果相等,则将内存地址 V 中存储的值更新为新值 B;
  3. 如果不相等,则说明其他线程已经修改了内存地址 V 中存储的值,此时 CAS 操作失败,需要重新尝试。

122. CAS 怎么实现?

在 Go 中,使用 sync/atomic 包提供的 CompareAndSwapXXX() 函数可以执行 CAS 操作,其中 XXX 表示不同的数据类型。例如,CompareAndSwapInt32() 函数用于
对一个 int32 类型的变量执行 CAS 操作。以下是一个简单的示例:

go">package main
import ("fmt""sync/atomic"
)
func main() {var value int32 = 1// 将 value 变量的值从 1 修改为 2atomic.CompareAndSwapInt32(&value, 1, 2)fmt.Println("value:", value)
}

在这个例子中,我们首先定义了一个 int32 类型的变量 value,并使用 CompareAndSwapInt32() 函数将其从 1 修改为 2。CompareAndSwapInt32() 函数的第一个参数是一个指向 int32 类型变量的指针,它告诉函数要对哪个变量进行 CAS 操作。第二个参数是期望值 A,第三个参数是新值 B。如果 value 的值与期望值 A 相等,则函数会将 value 的值更新为新值 B,并返回 true,否则不会更新 value 的值,并返回 false。在这个例子中,value 的初始值是 1,期望值 A 是 1,新值 B 是 2,因此 CAS 操作会成功,value 的值会被更新为 2。

需要注意的是,CAS 操作虽然可以避免锁的使用,提高了并发性能,但是也存在一些问题,比如 ABA 问题。因此在使用 CAS 操作时,需要谨慎设计并发控制策略,以确保线程安全。

123. sync.Pool 有什么用?

sync.Pool 是 Go 标准库中的一个对象池实现,它的作用是缓存对象,减少对象的创建和垃圾回收,从而提高程序的性能。

在程序中,创建和销毁对象是很耗费时间和资源的操作,特别是在高并发情况下。如果能够复用已经创建好的对象,就可以减少对象的创建和垃圾回收,提高程序的性能。这就是对象池的作用。

sync.Pool 的实现比较简单,它维护了两个对象池:一个是空闲对象池,用于存储可重复使用的对象;另一个是新对象池,用于存储不能重复使用的对象。在使用对象时,首先从空闲对象池中获取对象,如果空闲对象池为空,则从新对象池中获取对象,如果新对象池也为空,则创建一个新对象。使用完对象后,将对象放回空闲对象池中。

需要注意的是,sync.Pool 并不保证对象一定会被重用。如果空闲对象池中没有可用的对象,或者对象已经达到了一定的数量限制,那么 sync.Pool 会选择创建新对象。因此,在使用 sync.Pool 时,需要谨慎设计对象的数量和生命周期,以确保对象的重复使用。


http://www.ppmy.cn/ops/152455.html

相关文章

封装 调用第三方链接接口

function payOutCardInfo($card_id,$amount) {$url config(payOut.url).v1/cash-out/card-info;$headers [accept: */*,Content-Type: application/json];//$data [cardId > $card_id,amount > $amount,];// 将数据转换为JSON格式$jsonData json_encode($data);// 初…

C# 动态创建Label和ComboBox控件并修改Text获取Text

背景:在做项目的时候可能需要根据一定数量创建某些控件并修改其属性,本文以控件label、ConboBox控件进行动态创建。 程序运行前后的的Form动态图 代码如下: using System; using System.Collections.Generic; using System.ComponentModel; …

自动化标注平台开源,基于 yolov8标注平台可本地部署

yolov8标注平台本地部署(docker部署),已调通yolov8模型自动预标注功能。 下面开始背景知识…… 1)数据标注为什么在人工智能时代如此重要? 数据标注在人工智能时代如此重要,原因如下: 为机器…

《自动驾驶与机器人中的SLAM技术》ch8:基于预积分和图优化的紧耦合 LIO 系统

目录 1 预积分 LIO 系统的经验 2 预积分图优化的顶点 3 预积分图优化的边 3.1 NDT 残差边(观测值维度为 3 维的单元边) 4 基于预积分和图优化 LIO 系统的实现 4.1 IMU 静止初始化 4.2 使用预积分预测 4.3 使用 IMU 预测位姿进行运动补偿 4.4 位姿配准部…

[Spring] OpenFeign的使用

🌸个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 🏵️热门专栏: 🧊 Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 🍕 Collection与…

MySQL 窗口函数

MySQL 窗口函数 1,窗口函数 1.1,什么是窗口函数1.2,基本语法 2,函数详解 2.1,聚合函数2.2,排序函数2.3,偏移函数2.4,值函数 3,进阶用法 1,窗口函数 1.1&am…

PHP校园助手系统小程序

🔑 校园助手系统 —— 智慧校园生活 📱一款基于ThinkPHPUniapp框架深度定制的校园助手系统,犹如一把智慧之钥,专为校园团队精心打造,解锁智慧校园生活的无限精彩。它独家适配微信小程序,无需繁琐的下载与安…

mysql数据被误删的恢复方案

文章目录 一、使用备份恢复二、使用二进制日志(Binary Log)三、使用InnoDB表空间恢复四、使用第三方工具预防措施 数据误删是一个严重的数据库管理问题,但通过合理的备份策略和使用适当的恢复工具,可以有效地减少数据丢失的风险…