LongAdder 和 AtomicLong

2024-04-01 07:44
文章标签 longadder atomiclong

本文主要是介绍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应该更适用。

这篇关于LongAdder 和 AtomicLong的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/866605

相关文章

【Java并发】原子类源码分析之AtomicLong

JDK1.8 // 大部分和AtomicInteger没有太多差别,只标记不同的地方public class AtomicLong extends Number implements java.io.Serializable {private static final long serialVersionUID = 1927816293512124184L;// setup to use Un

并发包有了AtomicLong为什么还需要LongAdder?

1.AutomaticLong和LongAdder区别        AutomaticLong的底层是通过CAS(compareAndSwap)来实现线程的同步,是在一个死循环内不断的尝试修改目标的值,直到修改成功。如果在竞争不激烈的情况下,它修改成功的概率很高,否则的话修改失败的概率就会很高, 在大量修改失败的时候这些原子操作就会多次循环尝试, 因此性能就会受到影响。对于普通类型的long和

并发读源码——AtomicInteger/AtomicLong/AtomicStampedReference

文章目录 1. AtomicInteger描述2. 源码解析3. AtomicInteger演示示例4. 多线程用法 1. AtomicInteger描述 AtomicInteger从名字上看是操作Integer整数的,但Integer是线程不安全的,AtomicInteger是线程安全的。AtomicInteger的作用可以把两个Integer对象的加减乘除等操作变成一个原子操

AtomicLong与LongAdder对比

前言 《阿里巴巴 Java开发手册》读后感—拥抱规范,远离伤害:https://blog.csdn.net/f641385712/article/details/84930279 写这篇博文的原因,是因为我今天在看阿里的规范手册的时候(记录在了这里:《阿里巴巴 Java开发手册》读后感—拥抱规范,远离伤害),发现了有一句规范是这么写的: 如果是count++操作,使用如下类实现: Atomi

LongAdder和AtomicLong的对比实验

LongAdder 的核心思想是热点分离,与 ConcurrentHashMap 的设计思想类似:将value值分离成一个数组,当多线程访问时,通过Hash算法将线程映射到数组的一个元素进行操作;而获取最终的value结果时,则将数组的元素求和。最终,通过 LongAdder 将内部操作对象从单个value值“演变”成一系列的数组元素,从而减小了内部竞争的粒度。 package cn.jaa

我从LongAdder中窥探到了高并发的秘籍,上面只写了两个字...

这是why的第 53 篇原创文章 先说AtomicLong 关于 AtomicLong 我就不进行详细的介绍了。 先写这一小节的目的是预热一下,抛出一个问题,而这个问题是关于 CAS 操作和 volatile 关键字的。 我不知道源码为什么这样写,希望知道答案的朋友指点一二。 抱拳了,老铁。 为了顺利的抛出这个问题,我就得先用《Java并发编程的艺术》一书做引子,引出这个问题。 首先在书的

比AtomicLong更高效的并发计数器

我喜欢新鲜玩意儿,而Java 8里面就有[url=http://www.javacodegeeks.com/2014/03/5-features-in-java-8-that-will-change-how-you-code.html]不少[/url]。这回我准备介绍一下我的一个最爱——并发计数器。这是一组新的类,用于维护多个线程并发读写的计数器。新的API带来了显著的性能提升,同时还保证了接口的

并发编程实战14-LongAdder统计加法器-计数器jdk8

传统的原子锁AtomicLong/AtomicInt虽然也可以处理大量并发情况下的计数器,但是由于使用了自旋等待,当存在大量竞争时,会存在大量自旋等待,而导致CPU浪费,而有效计算很少,降低了计算效率。 而LongAdder是根据ConcurrentHashMap这类为并发设计的类的基本原理——锁分段,通过维护一个计数数组cells来保存多个计数副本,每个线程只对自己的副本进行操作,最后汇总来得

AtomicLong 原子操作

AtomicLong是作用是对长整形进行原子操作。 在32位操作系统中,64位的long 和 double 变量由于会被JVM当作两个分离的32位来进行操作,所以不具有原子性。而使用AtomicLong能让long的操作保持原子型。 创建具有初始值 0 的新 AtomicLong private AtomicLong sendCount = new AtomicLong(0); 创建具有

原子类-原子操作增强类理论入门、LongAdder和LongAccumulator简介

DoubleAccumulator:一个或多个变量,它们一起保持运行double使用所提供的功能更新值DoubleAdder:一个或多个变量一起保持初始为零double总和LongAccumulator:一个或多个变量,一起保持使用提供的功能更新运行的值long ,提供了自定义的函数操作LongAdder:一个或多个变量一起维持初始为零long总和(重点),只能用来计算加法,且从0开始计算