有了LongAdder还需要AtomicLong吗?

众所周知LongAdder在高并发场景下比AtomicLong高效很多,在低并发时基本持平,其原理就不说了,很多文章都有提到。

那么问题来了,既然如此iAtomicLong还有使用的必要吗?

我们来看看一个最常见的应用场景:多线程获取一个唯一的递增id。

AtomicLong提供 long incrementAndGet(),可以满足需求,该方法返回加1后的值,且是原子操作。多线程情况下不会有id重复。

LongAdder提供void increment() 注意这个操作并无返回值,只能保证原子递增,获取返回值还要调用long sum()。

也就是说,在自增与求和操作之间的会有并发更新,多线程情况下会有id重复,比如原值为2,可能会有两个线程同时获取到4.

因此这个场景下因该使用LongAdder无法胜任。

时间: 2024-11-25 15:58:18

有了LongAdder还需要AtomicLong吗?的相关文章

还在用Synchronized?Atomic你了解不?

前言 只有光头才能变强 之前已经写过多线程相关的文章了,有兴趣的同学可以去了解一下: https://github.com/ZhongFuCheng3y/3y/blob/master/src/thread.md 在阅读<阿里巴巴 Java开发手册>读后感时,还有未解决的问题: 如果是count++操作,使用如下类实现: AtomicInteger count = new AtomicInteger(); count.addAndGet(1);如果是 JDK8,推荐使用 LongAdder 对象

阿里巴巴 Java 开发手册 1.4.0

一.编程规约(一) 命名风格1. [强制]代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束.反例: _name / __name / $name / name_ / name$ / name__2. [强制]代码中的命名严禁使用拼音与英文混合的方式,更不允许直接使用中文的方式.说明:正确的英文拼写和语法可以让阅读者易于理解,避免歧义.注意,即使纯拼音命名方式也要避免采用.正例: alibaba / taobao / youku / hangzhou 等国际通用的名称,可视同

JDK8对并发的新支持

原文:JDK8对并发的新支持 1. LongAdder 和AtomicLong类似的使用方式,但是性能比AtomicLong更好. LongAdder与AtomicLong都是使用了原子操作来提高性能.但是LongAdder在AtomicLong的基础上进行了热点分离,热点分离类似于有锁操作中的减小锁粒度,将一个锁分离成若干个锁来提高性能.在无锁中,也可以用类似的方式来增加CAS的成功率,从而提高性能. LongAdder原理图: AtomicLong的实现方式是内部有个value 变量,当多线

Java锁---偏向锁、轻量级锁、自旋锁、重量级锁

之前做过一个测试,反复执行过多次,发现结果是一样的: 1. 单线程下synchronized效率最高(当时感觉它的效率应该是最差才对): 2. AtomicInteger效率最不稳定,不同并发情况下表现不一样:短时间低并发下,效率比synchronized高,有时甚至比LongAdder还高出一点,但是高并发下,性能还不如synchronized,不同情况下性能表现很不稳定: 3. LongAdder性能稳定,在各种并发情况下表现都不错,整体表现最好,短时间的低并发下比AtomicInteger

Java 语言特性【一】——JUC(Java 并发工具包)

引言 JUC即java.util.concurrent,是java提供的用于多线程处理的工具类库. 打开jdk包,JUC代码就在rt.jar包中,concurrent下有atomic和locks两个package,并且还有concurrentXXX.Executor.Future.Queue等. AtomicXXX atomic即原子类,如图: 其中,AtomicBoolean,AtomicInteger,AtomicLong,DoubleAccumulator,DoubleAdder,Long

【Java多线程】AtomicLong和LongAdder

AtomicLong简要介绍 AtomicLong是作用是对长整形进行原子操作,显而易见,在java1.8中新加入了一个新的原子类LongAdder,该类也可以保证Long类型操作的原子性,相对于AtomicLong,LongAdder有着更高的性能和更好的表现,可以完全替代AtomicLong的来进行原子操作. 在32位操作系统中,64位的long 和 double 变量由于会被JVM当作两个分离的32位来进行操作,所以不具有原子性.而使用AtomicLong能让long的操作保持原子型. A

AtomicLong和LongAdder的区别

AtomicLong的原理是依靠底层的cas来保障原子性的更新数据,在要添加或者减少的时候,会使用死循环不断地cas到特定的值,从而达到更新数据的目的. LongAdder在AtomicLong的基础上将单点的更新压力分散到各个节点,在低并发的时候通过对base的直接更新可以很好的保障和AtomicLong的性能基本保持一致,而在高并发的时候通过分散提高了性能. 缺点是LongAdder在统计的时候如果有并发更新,可能导致统计的数据有误差. 不少框架里面使用到了LongAdder这个类,而并非A

LongAdder和AtomicLong性能对比

jdk1.8中新原子操作封装类LongAdder和jdk1.5的AtomicLong和synchronized的性能对比,直接上代码: package com.itbac.cas; import java.util.concurrent.atomic.AtomicLong; import java.util.concurrent.atomic.LongAdder; // 测试用例: 同时运行2秒,检查谁的次数最多 public class LongAdderDemo { // synchroni

死磕 java并发包之LongAdder源码分析

问题 (1)java8中为什么要新增LongAdder? (2)LongAdder的实现方式? (3)LongAdder与AtomicLong的对比? 简介 LongAdder是java8中新增的原子类,在多线程环境中,它比AtomicLong性能要高出不少,特别是写多的场景. 它是怎么实现的呢?让我们一起来学习吧. 原理 LongAdder的原理是,在最初无竞争时,只更新base的值,当有多线程竞争时通过分段的思想,让不同的线程更新不同的段,最后把这些段相加就得到了完整的LongAdder存储