LongAdder 和 AtomicLong

有幸看到一篇关于这个讲解 2个类的讲解,自己也归纳总结一下。

一、解析

看源码底层会发现实现机制不一样,当然这个也是必须的

LongAdder

点进去之后会发现,CAS 它是一个CAS的实现类。至于Cell类JVM提供的内置函数

官方说法是:

仅支持原始访问和 CAS 的 AtomicLong 的填充变体。 JVM 内在函数注意:如果提供了 CAS,则可以在此处使用仅发布形式的 CAS。

AtomicLong

而Unsafe 官方自己说明一组不安全的方法,而Unsafe本身非java实现:

一组用于执行低级、不安全操作的方法。 尽管该类和所有方法都是公共的,但该类的使用受到限制,因为只有受信任的代码才能获得它的实例。 注意:调用者有责任确保在调用此类的方法之前检查参数。 虽然对输入执行了一些基本检查,但检查是尽最大努力的,并且当性能是压倒一切的优先事项时,当此类的方法由运行时编译器优化时,可能会省略部分或全部检查(如果有)。 因此,调用者不能依赖检查和相应的异常。

二、解释

说到这里,对比之后会发现LongAdder用的CAS是 VarHandle (JDK9开始存在)而 AtomicLong 用的是Unsafe

而查看VarHandle会发现主流CAS使用者AQS的存在。

而实现方式决定优势:

LongAdder 以数组形式进行值的cas操作,可以预见但多个并发请求过量时,可以分开进行添加

复制代码
public void add(long x) {
    Cell[] cs; long b, v; int m; Cell c;
    if ((cs = cells) != null || !casBase(b = base, b + x)) {
        boolean uncontended = true;
        if (cs == null || (m = cs.length - 1) < 0 ||
            (c = cs[getProbe() & m]) == null ||
            !(uncontended = c.cas(v = c.value, v + x)))
            longAccumulate(x, null, uncontended);
    }
}

AtomicLong 直接以原子的形式进行添加,过量时,可能对没有LongAdder优化了。

复制代码
public final long addAndGet(long delta) {
    return U.getAndAddLong(this, VALUE, delta) + delta;
}

总结:

这样一说,低并发一样效率,高并发,LongAdder应该更适用。

相关推荐
微风中的麦穗5 小时前
【MATLAB】MATLAB R2025a 详细下载安装图文指南:下一代科学计算与工程仿真平台
开发语言·matlab·开发工具·工程仿真·matlab r2025a·matlab r2025·科学计算与工程仿真
2601_949146535 小时前
C语言语音通知API示例代码:基于标准C的语音接口开发与底层调用实践
c语言·开发语言
开源技术6 小时前
Python Pillow 优化,打开和保存速度最快提高14倍
开发语言·python·pillow
学嵌入式的小杨同学6 小时前
从零打造 Linux 终端 MP3 播放器!用 C 语言实现音乐自由
linux·c语言·开发语言·前端·vscode·ci/cd·vim
毕设源码-朱学姐6 小时前
【开题答辩全过程】以 基于JavaWeb的网上家具商城设计与实现为例,包含答辩的问题和答案
java
mftang7 小时前
Python 字符串拼接成字节详解
开发语言·python
jasligea8 小时前
构建个人智能助手
开发语言·python·自然语言处理
kokunka8 小时前
【源码+注释】纯C++小游戏开发之射击小球游戏
开发语言·c++·游戏
C雨后彩虹8 小时前
CAS与其他并发方案的对比及面试常见问题
java·面试·cas·同步·异步·
云栖梦泽8 小时前
易语言开发从入门到精通:补充篇·网络编程进阶+实用爬虫开发·API集成·代理IP配置·异步请求·防封禁优化
开发语言