面试题:AtomicInteger底层是如何实现的?
有过Java面试经验的同学,可能很多都被问过这样一个问题:说一说AtomicInteger底层是如何实现的。
废话不多说,源码先贴出来:
public final int getAndAddInt(Object var1, long var2, int var4) {
int var5;
do {
var5 = this.getIntVolatile(var1, var2);
} while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4));
return var5;
}
可以看到,底层是通过Unsafe提供的CAS操作来实现的。由于需要成功并返回数据,所以算法是循
环重试的。能回答出来CAS,基本算是对这块有一些了解了。但是,有的面试官还会继续追问:那你说说
,CAS在底层是如何实现的?
以X86 CPU为例,提供了cmpxchg指令,这个指令,能保证CAS操作不受其他CPU核的影响,保证了
原子性。能回答出cmpxchg就算是学的比较深了,但是,喜欢深问的面试官又会继续问:CAS对操作的对
像有什么要求吗?
当然有了,CAS需要提供四个参数,对象引用、偏移量、期望值、目标值,CAS要操作的数据,正是
对象引用+偏移量所指向的数据。那么,为了保证数据修改后立马可见,这个数据,必须修饰为volatile。
说到这,也就对AtomicInteger理解的差不多了。但是有的面试官可能还会继续追问:CAS的优点是
什么?适合什么场景?
从原理就能看出来,CAS是无锁的原子操作。那么要实现具有锁功能的原子工具,就必须循环重试,重
试,必然是一个吃CPU的操作,所以CAS适合运用在并发竞争不大的场景。
另外,没有频繁的上下文切换,也是CAS的一个优势,CAS算是一个轻量级的操作。
总结下,CAS这个技术其实是乐观思维的体现。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构