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

✍个人博客: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 修改为 2
    atomic.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 时,需要谨慎设计对象的数量和生命周期,以确保对象的重复使用。

相关推荐
zhangxueyi3 分钟前
图解Java实现冒泡排序(Bubble Sort)
java·开发语言
麦麦Max6 分钟前
STL-函数对象
开发语言·c++·算法
我是前端小学生10 分钟前
Go 语言中的 Channel 全面解析
go
索码理13 分钟前
初探MCP:对Excel操作不熟练?不怕,MCP来帮你
人工智能·后端·mcp
Yharim14 分钟前
如何编造一个项目经验?
面试
IT杨秀才16 分钟前
Go语言单元测试指南
后端·单元测试·go
陆通17 分钟前
MCP大模型协议:让AI与世界无缝对话的"万能翻译官"
后端
_一条咸鱼_23 分钟前
Android大厂面试秘籍: Activity Intent 解析与处理模块(三)
android·面试·android jetpack
bobz96525 分钟前
LXC LXD vs KVM
后端
仙人掌_lz31 分钟前
使用Python从零实现一个端到端多模态 Transformer大模型
开发语言·人工智能·python·ai·transformer·多模态