首页 > 其他分享 >面试题:AtomicInteger底层是如何实现的?

面试题:AtomicInteger底层是如何实现的?

时间:2024-01-16 23:23:30浏览次数:20  
标签:var5 面试题 CAS AtomicInteger 操作 CPU 底层

  有过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这个技术其实是乐观思维的体现。

标签:var5,面试题,CAS,AtomicInteger,操作,CPU,底层
From: https://www.cnblogs.com/kingcode/p/17968841

相关文章

  • Mybatis面试题汇总(36)
    对MyBatis的认识[4]简单介绍下MyBatisMyBatis是一款优秀的持久层框架,它支持自定义SQL、存储过程以及高级映射。MyBatis免除了几乎所有的JDBC代码以及设置参数和获取结果集的工作。MyBatis可以通过简单的XML或注解来配置和映射原始类型、接口和JavaPOJO(PlainOldJava......
  • 一文让你对mysql索引底层实现明明白白
    开篇:图片是本人随笔画的,有点粗糙,望大家谅解,如有不妥之处,请联系我们,感谢一、索引到底是什么.索引是帮助mysql高效获取数据的排好序的数据结构.索引是存储在文件里的.数据结构:二叉树HASHBTREE   如果没有索引的话,循环一条一条的找,找一次就是一次IO,这样速度就会很慢......
  • 一文让你对mysql索引底层实现明明白白
    开篇:图片是本人随笔画的,有点粗糙,望大家谅解,如有不妥之处,请联系我们,感谢。一、索引到底底是什么.索引是帮助mysql高效获取数据的排好序的数据结构.索引是存储在文件里的.数据结构:二叉树HASHBTREE如果没有索引的话,循环一条一条的找,找一次就是一次IO,这样速度就会很慢我们知道数据库......
  • 面试题专辑
    hashmap:底层数据结构不同:1.7是数组加链表,1.8是红黑树加数组。为何用红黑树:,为何不上来直接树化,树化值为为啥是8,合适会树化,何时会退化为链表?1.红黑树为了避免dos攻击,防止性能下降,树化树偶然那个情况1.1哈希表查找时候,更新时间复杂度为o1,红黑树的查找时间复杂度为olog2n,TreeNo......
  • MySQL面试题(1):count
    InnoDB和MyISAM的count(*)有何不同MyISAM引擎把一个表的总行数存在了磁盘上,因此执行count(*)的时候会直接返回这个数(无where条件)InnoDB执行count(*)的时候,需要把数据一行一行地从引擎里面读出来,然后累积计数为什么InnoDB不跟MyISAM一样,也把数字存起来呢?因为......
  • 【前端面试】2024年前端面试题之JS篇
    请简述JavaScript中的thisJS中的this是一个相对复杂的概念,不是简单几句能解释清楚的。粗略地讲,函数的调用方式决定了this的值。我阅读了网上很多关于this的文章,ArnavAggrawal写的比较清楚。this取值符合以下规则:在调用函数时使用new关键字,函数内的this是一个全新的对......
  • 软件测试笔试面试题目完全汇总
    软件缺陷:1)软件未实现产品说明书要求的功能2)软件出现了产品说明书指明不应该出现的错误3)软件实现了产品说明书未提到的功能4)软件未实现产品说明书虽未明确提及但应该实现的目标5)软件难以理解、不易使用、运行缓慢或者从测试员的角度看最终用户会认为不好。软件测试:为了发现......
  • 软件测试常考面试题-软件测试面试宝典(一篇足矣)
    软件测试常考面试题-软件测试面试宝典(一篇足矣) 介绍解决锻炼思维问题的思路和方法,从不同角度分析问题,让思维变强大,变宽广的同时在测试方面进行学习和方法的拓展,也会分享读书心得和问题思考。 问:软件测试的原则?答:软件测试的八个原则_山鬼谣弋痕夕的博客-CSDN博客_软件测试......
  • c#面试题及答案(二)
    c#面试题及答案(二)  注意:红色字体部分是本人更正了网络上的一些错误答案。 2.列举ASP.NET页面之间传递值的几种方式。答.1).使用QueryString,如....?id=1;response.Redirect()....                 2).使用Session变量         ......
  • C# 面试题 (持续更新中)
    1.抽象方法和虚方法在编程中都是处理继承和多态的重要概念,它们之间的关键差异是什么?①定义和实现:抽象方法是只有方法名称,没有方法体(也就是没有方法具体实现),子类必须重写父类抽象方法。虚方法有方法体,子类可以覆盖,也可不覆盖。②声明位置:抽象方法只能声明在抽象类中,使用关键字......