Java 核心技术面试精讲
杨晓峰
前 Oracle 首席工程师
125942 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 44 讲
Java 核心技术面试精讲
15
15
1.0x
00:00/00:00
登录|注册

第22讲 | AtomicInteger底层实现原理是什么?如何在自己的产品代码中应用CAS操作?

AQS(AbstractQueuedSynchronizer)
知识扩展
其他并发结构的底层实现技术
CAS的应用
CAS的底层实现
CAS操作细节
AtomicInteger底层实现原理
AtomicInteger底层实现原理和CAS操作应用

该思维导图由 AI 生成,仅供参考

在今天这一讲中,我来分析一下并发包内部的组成,一起来看看各种同步结构、线程池等,是基于什么原理来设计和实现的。
今天我要问你的问题是,AtomicInteger 底层实现原理是什么?如何在自己的产品代码中应用 CAS 操作?

典型回答

AtomicIntger 是对 int 类型的一个封装,提供原子性的访问和更新操作,其原子性操作的实现是基于 CAS(compare-and-swap)技术。
所谓 CAS,表征的是一系列操作的集合,获取当前数值,进行一些运算,利用 CAS 指令试图进行更新。如果当前数值未变,代表没有其他线程进行并发修改,则成功更新。否则,可能出现不同的选择,要么进行重试,要么就返回一个成功或者失败的结果。
从 AtomicInteger 的内部属性可以看出,它依赖于 Unsafe 提供的一些底层能力,进行底层操作;以 volatile 的 value 字段,记录数值,以保证可见性。
private static final jdk.internal.misc.Unsafe U = jdk.internal.misc.Unsafe.getUnsafe();
private static final long VALUE = U.objectFieldOffset(AtomicInteger.class, "value");
private volatile int value;
具体的原子操作细节,可以参考任意一个原子更新方法,比如下面的 getAndIncrement。
Unsafe 会利用 value 字段的内存地址偏移,直接完成操作。
public final int getAndIncrement() {
return U.getAndAddInt(this, VALUE, 1);
}
因为 getAndIncrement 需要返归数值,所以需要添加失败重试逻辑。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Java并发编程底层原理与技术 本文深入探讨了Java并发编程的底层原理和相关技术,重点介绍了AtomicInteger的底层实现原理基于CAS技术。CAS是一种无锁机制,通过一系列操作来实现原子性操作,包括获取当前数值、进行运算和利用CAS指令尝试更新。此外,文章还介绍了CAS的使用场景和实现方式,以及对Variable Handle API和AbstractQueuedSynchronizer(AQS)的简要介绍。Variable Handle API提供了精细粒度的公共底层API,而AQS作为Java并发包中实现各种同步结构和部分其他组成单元的基础,为构建同步结构提供了范本。通过对ReentrantLock的实现,文章展示了AQS的内部数据和方法,以及如何利用AQS实现一个同步结构。总的来说,本文对于想深入了解并发编程的读者具有一定的参考价值,能够帮助读者快速了解Java并发编程的底层原理和相关技术。 本文深入探讨了Java并发编程的底层原理和相关技术,重点介绍了AtomicInteger的底层实现原理基于CAS技术。CAS是一种无锁机制,通过一系列操作来实现原子性操作,包括获取当前数值、进行运算和利用CAS指令尝试更新。此外,文章还介绍了CAS的使用场景和实现方式,以及对Variable Handle API和AbstractQueuedSynchronizer(AQS)的简要介绍。Variable Handle API提供了精细粒度的公共底层API,而AQS作为Java并发包中实现各种同步结构和部分其他组成单元的基础,为构建同步结构提供了范本。通过对ReentrantLock的实现,文章展示了AQS的内部数据和方法,以及如何利用AQS实现一个同步结构。总的来说,本文对于想深入了解并发编程的读者具有一定的参考价值,能够帮助读者快速了解Java并发编程的底层原理和相关技术。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Java 核心技术面试精讲》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(32)

  • 最新
  • 精选
  • I.am DZX
    CANCELLED 1 因为超时或中断设置为此状态,标志节点不可用 SIGNAL -1 处于此状态的节点释放资源时会唤醒后面的节点 CONDITION -2 处于条件队列里,等待条件成立(signal signalall) 条件成立后会置入获取资源的队列里 PROPAGATE -3 共享模式下使用,头节点获取资源时将后面节点设置为此状态,如果头节点获取资源后还有足够的资源,则后面节点会尝试获取,这个状态主要是为了共享状态下队列里足够多的节点同时获取资源 0 初始状态

    作者回复: 好

    2018-06-26
    33
  • Cui
    老师,看了AQS的实现原理后,我再回顾了您之前关于synchronized的文章,心中有些疑问: 1、synchronized在JVM中是会进行锁升级和降级的,并且是基于CAS来掌握竞争的情况,在竞争不多的情况下利用CAS的轻量级操作来减少开销。 2、而AQS也是基于CAS操作队列的,位于队列头的节点优先获得锁,其他的节点会被LockSupport.park()起来(这个好像依赖的是操作系统的互斥锁,应该也是个重量级操作)。 我觉得这两种方式都是基于CAS操作的,只是操作的对象不同(一个是Mark Word,一个是队列节点),当竞争较多时,还是不可避免地会使用到操作系统的互斥锁。然而,我再测试这两者的性能时,在无竞争的情况下,两者性能相当,但是,当竞争起来后,AQS的性能明显比synchronized要好(测试案例是8个线程并发对一个int递增,每个线程递增1000万次,AQS的耗时大概要少30%),这是为什么呢?

    作者回复: Locksupport的实现据说速度快,我也没具体对比过;不过jdk9里,monitor相关操作也加快了,可以看看jep143

    2018-06-26
    6
    20
  • 三口先生
    大于0取消状态,小于0有效状态,表示等待状态四种cancelled,signal,condition,propagate

    作者回复: 不错

    2018-06-26
    17
  • 卡斯瓦德
    老师请教个问题,acquireQueued的源代码中,使用for(;;)做了个自旋锁吧,作者为什么不用while(true),这种方式呢,是因为开销不一样吗?

    作者回复: 也许,这个我不知道具体原因,看上去while会比for多一个变量

    2018-07-05
    2
    5
  • TonyEasy
    老师,说实话这一期的对我来说有点难度了,钦佩老师对知识理解的深入,请问老师可以指点下java学习的路线图吗,或者您分享下您自己的学习路线。

    作者回复: 大家基础不一样,以后被问到不生疏也好;关于路线,不知道你的兴趣和规划是什么,通常来说Java只是技能树中的一项,项目经验,领域知识,综合起来才能要到高价

    2018-06-26
    3
  • antipas
    看AQS源码过程中产生了新问题,它对线程的挂起唤醒是通过locksupport实现的,那么它与wait/notify又有何不同,使用场景有何不同。我的理解是使用 wait/notify需要synchronized锁,而且wait需要条件触发

    作者回复: 这是两种方式,wait基于monitor;一般用并发库就不用Object.wait、notify之类了

    2018-06-26
    2
    2
  • ylw666
    LongAdder这里,说要考虑紧凑性的影响,不清楚指的是哪方面的考虑

    作者回复: 紧凑就是说内存使用效率,有些高性能应用会对此提出苛刻要求

    2019-01-26
  • xuanyuan
    建议; 1. 希望能有推外内存的主题,范型部分希望能与cpp比较讲解。 2. 一些主题如果已经有公开的比较好的资料,可以提供链接,对重点强调即可。希望能看到更多公开资料所没有的信息,这也是老鸟们付费的初衷。 同意的点赞
    2018-06-26
    5
    152
  • ipofss
    这一讲对于我来说,挺有难度的,还是基础比较薄弱,整体上没太听懂。老师对于Java的理解真是太深入了,等我以后技术精进了,再回来看看老师的36讲,应该会有新的认识。继续往下听吧,已经懂点的加深理解,没听过的就当是听了名字以后用到了再仔细研究
    2018-08-07
    4
    38
  • OneThin
    能否出一节讲一下unsafe,感觉这个才是最基础的。另外unsafe为什么叫unsafe呢
    2018-07-16
    3
    16
收起评论
显示
设置
留言
32
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部