《面试1v1》CAS

news2025/1/13 3:31:48

我是 javapub,一名 Markdown 程序员从👨‍💻,八股文种子选手。

在这里插入图片描述

面试官: 上个面试官对你的基础有了一定了解,听说你小子很不错!下面我们聊点有深度的。

面试官: 简单介绍下 CAS 你了解什么?

候选人: CAS是Compare And Swap的缩写,中文意思是比较与交换。它是一条 CPU 的原子指令,用于比较内存某个位置的值是否为预期值,如果是则更改为新的值。这一整个过程是原子的,也就是说它是线程安全的。

面试官: CAS 的用处是什么?

候选人: CAS 主要用于实现非阻塞算法。常见的使用场景有:

  1. 实现原子操作:像 Java 的 AtomicInteger,它使用 CAS 来原子更新变量值。
// AtomicInteger 中 CAS 的运用
private volatile int value;
public final int getAndIncrement() {
    int next;
    do {
        next = get();
    } while (!compareAndSet(next, next + 1));
    return next; 
}
  1. 实现锁的非阻塞式获取:像乐观锁。先假设可以获取锁,如果获取失败了再判断是否需要阻塞。
  2. 实现非阻塞的数据结构:像 ConcurrentLinkedQueue。使用 CAS 来实现链表节点的非阻塞追加等操作。
  3. 实现线程调度:像 Swing 里的 EDT(事件调度线程),通过 CAS 来实现对事件调度状态的修改。

面试官: 说说 CAS 的 ABA 问题?

候选人: CAS 操作包含三个操作数:内存位置(V)、旧的预期值(A)和新值(B)。如果当 CAS 操作开始时,V的确为A,但在 CAS 比较V和A之后,V的值变为了其他值,然后又变回A,就会产生ABA问题。
因为 CAS 操作只会在预期值A和当前值相同时更改为新值B,这时已经错失了一次更改的机会。
ABA 导致的问题是,当一个值原来是X,后来变成了Y,然后又变回X的时候,使用CAS进行检查时会发现它的值没有变化,但实际上却变动过了。这可能会对逻辑产生意料之外的影响。
常见的解决ABA问题的方法是使用版本号或者时间戳。在变量前面追加版本号version,每次变量更新的时候把version++,那么A-B-A 就会变成 1A-2B-3A,CAS 操作进行检查时就可以发现版本号不同,从而避免ABA问题。

面试官: 不错,CAS 是Java并发编程的基础之一,也是很重要的内容。能解释清楚CAS的ABA问题,且知道解决方法,未来会对并发编程有很大帮助。

候选人: 是的,CAS 是实现Java并发编程的基础工具之一,理解透彻CAS和ABA问题,对后续学习各种并发工具和框架,乃至设计并发系统会非常有帮助。我会继续深入学习CAS相关内容,了解更多实践应用的案例,并在项目中运用的更加娴熟。
谢谢面试官的提问,让我对CAS和ABA问题有了更全面和深入的认识,这些知识点确实对并发编程来说是基础中的基础。我一定会继续加深理解的!

面试官: 乐观锁和悲观锁了解吗?有什么区别?

候选人: 乐观锁和悲观锁是两种不同的锁机制:
悲观锁:总是假设会发生并发冲突,屏蔽一切可能违反数据完整性的操作。如synchronized关键词加在方法或者代码块上,会对该段代码采取排他锁,不允许其他线程同时执行。
乐观锁:假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。如果校验失败,就重试整个读取-修改-提交操作。典型的如CAS算法采用乐观锁。
两者主要区别在于对并发冲突的态度:

  • 悲观锁试图防止并发冲突,乐观锁则容忍并发冲突,并在发生冲突时重试。
  • 悲观锁会导致性能下降,因为任何时候只能有一个线程访问数据。而乐观锁可以让多个线程同时访问数据,只有在提交更新时才会检查并发冲突,所以性能更好。
  • 悲观锁一般由同步机制实现,开销更大。而乐观锁由CAS这样的原子操作实现,开销更小。
    所以,总体来说:
  • 读次数多、更新次数少,且更新不需要很强一致性的用乐观锁。
  • 更新频繁,需要强一致性的用悲观锁。
  • 两者也可以结合使用,先乐观锁重试几次,再悲观锁。

面试官: 你说的很详细,那你在项目中用过这两种锁吗?遇到什么问题?

候选人: 在项目中,我使用过synchronized作为悲观锁,和CAS + 版本号作为乐观锁。
使用synchronized时,由于锁定粒度太大,导致性能下降比较严重。后来在一些只读的方法上使用可重入锁ReentrantReadWriteLock,采用其读锁来提高并发度,性能得以提高。
使用CAS + 版本号时,由于业务的复杂性,导致版本号更新并不完全正确,产生过ABA问题。像在链表的删除操作,如果删除节点时版本号没有同步更新,这时线程B利用CAS把节点从A改成C,就产生了ABA问题,这时需要额外采取其他措施解决,比较棘手。
所以,总结来说使用锁机制时,需要考虑:

  1. 锁的粒度,尽量加在必要的范围内。
  2. 读写比例,如果读多,可以考虑读写锁。
  3. CAS使用时,要考虑清楚版本号的更新策略,避免ABA问题。
  4. 悲观锁和乐观锁也可以灵活结合,必要时采用悲观锁避免问题进一步扩大。
    通过上述实践,让我对这两种锁有了更深的认识,今后在设计系统和使用锁机制时可以运用的更加娴熟和灵活。

面试官: 很好,你对锁机制的理解已经深入到能够在实践中运用并解决遇到的问题的地步。这是学以致用的好例子,也让我对你的能力有了更高的评价。

今天就先到这吧。

候选人: 谢谢面试官的肯定。锁机制作为并发编程的基础,我也花了不少时间去理解和实践。在项目我玩的贼6。

最近我在更新《面试1v1》系列文章,主要以场景化的方式,讲解我们在面试中遇到的问题,致力于让每一位工程师拿到自己心仪的offer,感兴趣可以关注JavaPub追更!

🎁目录合集:

Gitee:https://gitee.com/rodert/JavaPub

GitHub:https://github.com/Rodert/JavaPub

http://javapub.net.cn

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

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

相关文章

10款Photoshop免费在线工具推荐

AdobePhotoshop下载繁琐,付费昂贵,让很多设计师望而却步! 经过几个小时的筛选和测试,筛选出10款Photoshop免费在线工具,与Photoshop一样强大。让我们看看! 1.即时设计 智能抠图 当我们想要去重图片背景&…

【鲁棒优化、机会约束】具有分布鲁棒联合机会约束的能源和储备调度研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

JAVA中的深情哥-Exception(异常)-上

文章目录 目录 文章目录 前言 一,Exception的起源 二,异常类 三,自定义异常 总结 前言 大家好,我是最爱吃兽奶,今天给大家介绍一下java中的深情哥 - Exception 秋风依依秋水寒,一点离愁两黯然;今生默默唯轻舞&a…

抖音林客系统开发

抖音林客系统是一款基于AI技术的推荐算法系统,主要应用于抖音平台中用户的内容推荐和个性化服务。开发抖音林客系统需要掌握以下关键技术: 数据采集与处理:需要对海量的用户数据进行采集和处理,包括用户的观看历史、互动行为、…

K-Village NFT 作品集

K-Village 是韩国领先的娱乐公司和 Cube 娱乐公司所拥有的空间,引领了元宇宙行业的发展。在这个虚拟的「韩国村」中,可以参观代表韩国文化的韩国公司和品牌。 此外,这个系列的购买者还将获得特别奖励!如果你刚好拥有 20 个 K-Vill…

不懂Spring IOC?你可能已经OUT了!快来了解它的奥秘!

大家好,我是小米,一个热衷于技术分享的小伙伴。今天,我想和大家聊一聊Spring IoC(Inversion of Control)的理解、原理与实现。对于使用Spring框架的开发者来说,IoC容器是一个非常重要的概念,它帮…

C++ ---- 日期类实现+阅读文档(文档可直接下载)

日期类文档下载(日期类详细介绍) word文档 MyDate/MyDate/日期类阅读文档.docx 张喜阳/进阶代码仓库 - Gitee.comhttps://gitee.com/niuniuzxy/advanced-code-warehouse/blob/a25baeee2bd0f0c64f96315bb0d0023308329d92/MyDate/MyDate/%E6%97%A5%E6%9C%9F%E7%B1%BB%E9%98%85…

十六、Config分布式配置中心

目录 分布式配置中心概述 1、为什么需要分布式配置中心? 2、配置中心的作用: Spring Cloud Config简介 新建项目springcloud-config-server 1、引入配置中心config-server的依赖 2、在github/gitee上新建一个远程仓库作为config的远程配置中心 3、…

3年测试技术面一题都看不懂,字节面试真的变态.....

最近我的一个读者朋友去了字节面试,来给我发信息吐槽,说字节的面试太困难了,像他这种三年经验的测试员,在技术面,居然一题都答不上来,这要多高的水平才能有资格去面试字节的测试岗位。 确实,字…

Vue2+CSS实现一个瀑布流布局案例

在练习代码的时候,看到了携程的首页下方的布局还挺好看 就是一个瀑布流的布局效果,在携程上是一共两列布局,然后每个格子的高度都会根据图片的高度做排布 一开始是想使用flex进行布局,先让每个格子各占百分之49,然后贴…

微信小程序实现电子书搜索与下载

1、背景 自己已经做了一版电子书下载网站(走蛟电子书),但用户使用手机更方便些,为改善用户体验,准备做一款微信小程序实现电子书搜索与下载的功能。 2、技术栈 由于功能较为单一,因此前端使用原生的微信…

CSS基础语法

CSS基础语法知识 文章目录 CSS基础语法1. CSS的引入方式1.1 内部样式1.2 外部样式1.3 内联样式 2. CSS标签选择器2.1 标签选择器2.2 类选择器2.3 id选择器2.4 复合选择器 3. CSS常见属性3.1 字体相关3.2 文本相关3.3 颜色的写法3.4 背景相关3.5 边框相关3.6 元素的显示模式3.7 …

【链表应用】| 一元多项式的操作

目录 一. 🦁 要求:二. 代码实现(Java & c)1. Java实现2.C语言实现 三. 🦁 总结 一. 🦁 要求: 设有两个一元多项式: p(x)p0p1xp2x2pnxn q(x)q0q1xq2x2qmxm 多项式项的系数为实数,指数为整数&#xff0c…

11个免费的数据可视化工具推荐

数据可视化之所以流行,不仅是因为它简化了我们查看复杂数据的方式,更是因为数据可视化可以加快我们获取数据信息的速度。 本文专门为您列出了11个免费的数据可视化工具,帮助您快速掌握数据可视化技能。 1.即时设计 即时设计是可云端编辑的…

物通博联工业物联网解决方案,助力工厂实现设备远程运维

各类设备制造工厂随着经营规模与业务的扩张,设备可以销往全国各地甚至是全球,是工厂实力的体现。当设备越来越多、分布越来越广,设备管理的工作量和成本直线上升,可能面对维护不及时的情况,影响到客户经济效益和对工厂…

spark源码 spark on yarn环境的创建

1.入口类 sparkSubmit 的main方法 提交application submitnew SparkSubmit submit.doSubmit(args) -> super.doSubmit(args): parseArguments(args) :参数解析 方法 中 new sparkSubmitArguments(args) 点进去该类(主要解析参数),然后找到parse&am…

C/C++ 内存管理 new delete operator new与operator delete函数 内存泄漏

C/C 内存分布 在C/C 当中有 : 局部数据静态数据和全局数据常量数据动态申请数据 上述不同的数据存储的位置也不同,: 1. 栈又叫堆栈--非静态局部变量/函数参数/返回值等等,栈是向下增长的。2. 内存映射段是高效的I/O映射方式&…

Java运算符详解

目录 🔑前言 🎽算式运算符 ⚙赋值运算符 🍊关系运算符 🍺逻辑运算符 🍒位运算符 🌹移位运算符 🍃条件运算符 🍉运算符优先级 🔑前言 任何一个程序都离不开计算问题&…

IOC/DI配置管理第三方bean(Druid/C3P0)

文章目录 1 案例:数据源对象管理1.1 环境准备1.2 思路分析1.3 实现Druid管理步骤1:导入druid的依赖步骤2:配置第三方bean步骤3:从IOC容器中获取对应的bean对象步骤4:运行程序 1.4 实现C3P0管理步骤1:导入C3P0的依赖步骤2:配置第三方bean步骤3:运行程序 2 加载properties文件2.1…

详解MySQL的并发控制

目录 1.概述 2.事务 2.1.什么是事务 2.2.事务的隔离级别 2.2.1.三种数据一致性问题 2.2.2.四种隔离级别 2.3.如何设置隔离级别 3.锁 3.1.锁与事务的关系 3.2.分类 3.3.表锁 3.3.1.概述 3.3.2.读锁 3.3.3.写锁 3.3.4.保护机制 3.4.行锁 3.4.1.概述 3.4.2.什么…