【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 时,需要谨慎设计对象的数量和生命周期,以确保对象的重复使用。

相关推荐
掘金码甲哥15 分钟前
1分钟买不了吃亏系列: nginx动态域名解析
后端
神奇小汤圆36 分钟前
2026大厂Java岗面试记录:八股+场景+项目+AI,一文讲透快速上岸路径(含答案)
后端
kyriewen39 分钟前
别再这样写 async/await 了:我在 Code Review 中见过最多的 8 个错误
前端·javascript·面试
神奇小汤圆41 分钟前
我说MySQL每张表最好不超过2000万条数据,面试官让我回去等通知?
后端
HuanYu1 小时前
JDK实现动态代理
后端
袋鱼不重1 小时前
解决 Web 端图片预览与下载颜色不一致的一种工程方案
前端·后端
lizhongxuan1 小时前
Agent 的 Code-driven Assembly
后端
稀土熊猫君1 小时前
一个人能做出什么开源项目?
vue.js·后端·开源