首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏不会写文章的程序员不是好厨师

    浅析LongAdder

    浅析LongAdder 前言 上文中分析了AtomicLong以及Unsafe,本文将为大家带来LongAdder的分析.LongAdder之前在guava以及hystrix等中出现,但是目前已经出现在 但是高并发的场景下,LongAdder有着明显更高的吞吐量,但是有着更高的空间复杂度。 从上面的java doc来看,LongAdder有两大方法,add和sum。 替代 有了传说中更高效的LongAdder,那AtomicLong可否不使用了呢? 答案就在LongAdder的java doc中,从我们翻译的那段可以看出,LongAdder适合的场景是统计求和计数的场景,而且LongAdder基本只提供了add方法,而AtomicLong还具有cas 在高并发场景下,qps这个值会被多个线程频繁更新的,所以LongAdder很适合。

    64710发布于 2018-09-05
  • 来自专栏程序员历小冰

    LongAdder解析

     对 LongAdder的最初了解是从Coolshell上的一篇文章中获得的,但是一直都没有深入的了解过其实现,只知道它相较于 AtomicLong来说,更加适合写多读少的并发情景。 今天,我们就研究一下 LongAdder的原理,探究一下它如此高效的原因。 基本原理和思想  Java有很多并发控制机制,比如说以AQS为基础的锁或者以CAS为原理的自旋锁。 而LongAdder的原理就是降低对value更新的并发数,也就是将对单一value的变更压力分散到多个value值上,降低单个value的“热度”。   我们知道 LongAdder的大致原理之后,再来详细的了解一下它的具体实现,其中也有很多值得借鉴的并发编程的技巧。 LongAdder的成员变量 LongAdder是 Striped64的子类,其有三个比较重要的成员函数,在之后的函数分析中需要使用到,这里先说明一下。

    44820发布于 2019-02-26
  • 来自专栏程序员历小冰

    LongAdder解析

     对LongAdder的最初了解是从Coolshell上的一篇文章中获得的,但是一直都没有深入的了解过其实现,只知道它相较于AtomicLong来说,更加适合写多读少的并发情景。 今天,我们就研究一下LongAdder的原理,探究一下它如此高效的原因。 基本原理和思想  Java有很多并发控制机制,比如说以AQS为基础的锁或者以CAS为原理的自旋锁。 而LongAdder的原理就是降低对value更新的并发数,也就是将对单一value的变更压力分散到多个value值上,降低单个value的“热度”。   我们知道LongAdder的大致原理之后,再来详细的了解一下它的具体实现,其中也有很多值得借鉴的并发编程的技巧。 LongAdder的成员变量  LongAdder是Striped64的子类,其有三个比较重要的成员函数,在之后的函数分析中需要使用到,这里先说明一下。

    56910发布于 2019-01-24
  • 来自专栏刘君君

    LongAdder 源码分析

    摘要: 有了 AtomicLong 为什么还会有 LongAdder ---- TOP 带着问题看源码 有了 AtomicLong 为什么还会有 LongAdder 1. 基本介绍 LongAdder 是一个线程安全,JDK 8新加入的一个用来计数的工具类 按照作者的说法,LongAdder 在多个线程更新下比 AtomicLong 性能更好,但要消耗更多的空间 LongAdder = null) a.value = 0L; } } } 总结 可以看到 LongAdder 的核心思路就是保证高并发最坏的情况,通过对线程进行散列分片减少竞争时长 回到开篇 TOP 1 问题,可以看到 LongAdder 主要目的是解决高并发下 AtomicLong 自旋开销问题 。

    67140发布于 2020-02-10
  • 来自专栏涓流

    LongAdder源码分析

    LongAdder 功能类似于 AtomicLong, 在低并发情况下两者表现差不多, 高并发下 LongAdder 的表现就好很多。 LongAdder 实现于 Striped64 Striped64 Striped64 对外的语义是一个数字,在内部将数字的“值”拆成了好几部分:一个base变量和一个cells数组。 long p9, p10, p11, p12, p13, p14, p15; } JDK8 有专门的注解 @Contended 来避免伪共享, Striped64 也是被 @Contended 所修饰 LongAdder LongAdder 继承于 Striped64, 也就继承了成员变量 cells 数组, base 变量和 Accumulate 逻辑。

    42110编辑于 2022-06-28
  • 来自专栏FunTester

    性能测试中的LongAdder

    但在高并发环境下,LongAdder有着明显更高的吞吐量,但是有着更高的空间复杂度(就是内存占用偏高)。 LongAdder是JDK1.8开始出现的,所提供的API基本上可以替换掉原先的AtomicLong。 of zero. */ public LongAdder() { } 默认值0。 统计 统计方法中最核心的是java.util.concurrent.atomic.LongAdder#sum,其他java.util.concurrent.atomic.LongAdder#intValue 性能测试 下面写个简单的性能测试脚本: public static void main(String[] args) { LongAdder adder = new LongAdder

    72030编辑于 2022-04-01
  • 来自专栏回顾

    LongAdder(下)代码实现原理

    LongAdder代码分析 为了解决高并发下多线程对一个变量CAS争夺失败后进行自旋而造成的降低并发性能的问题,LongAdder在内部维护多个Cell元素**(一个动态的Cell数组)**来分担单个变量进行争夺开销 下面围绕以下话题从源码角度来分析LongAdder的实现! LongAdder的结构是怎样的? 当前线程应该访问Cell数组里面哪一个Cell元素? 如何初始化Cell数组? Cell数组如何扩容? 解决问题1,首先看下LongAdder的类结构图,如图所示: ? 由该图可知,LongAdder继承自Striped64类,在Striped64内部维护着三个变量。 LongAdder的真实值其实是base的值与Cell数组里面所有Cell元素中的value值的累加,base是个基础值,默认为0。 下面先说一说LongAdder常用函数,然后在里边寻找答案。 long sum() 返回当前的值,内部操作是累加所有Cell内部的value值后再累加base。

    68930发布于 2020-04-29
  • 来自专栏Lambda

    AtomicLong和LongAdder的区别

    AtomicLong和LongAdder的区别 前言 最近在看到不少框架里面使用到了LongAdder这个类,而并非AtomicLong,很是困惑,于是专门看了LongAdder的源码,总结一下这两个的区别 那么LongAdder又是使用到了什么原理?难道有比cas更加快速的方式? LongAdder原理 首先我们来看一下LongAdder有哪些方法? 我们可以猜测到LongAdder的高明之处可能在于将之前单个节点的并发分散到各个节点的,这样从而提高在高并发时候的效率。 总结: LongAdder在AtomicLong的基础上将单点的更新压力分散到各个节点,在低并发的时候通过对base的直接更新可以很好的保障和AtomicLong的性能基本保持一致,而在高并发的时候通过分散提高了性能 缺点是LongAdder在统计的时候如果有并发更新,可能导致统计的数据有误差。

    49330编辑于 2022-04-13
  • 来自专栏allsmallpi博客

    AtomicLong和LongAdder的区别

    转载自 https://blog.csdn.net/yao123long/article/details/63683991 前言   最近在看到不少框架里面使用到了LongAdder这个类,而并非AtomicLong ,很是困惑,于是专门看了LongAdder的源码,总结一下这两个的区别。 那么LongAdder又是使用到了什么原理?难道有比cas更加快速的方式? LongAdder原理   首先我们来看一下LongAdder有哪些方法? ?    我们可以猜测到LongAdder的高明之处可能在于将之前单个节点的并发分散到各个节点的,这样从而提高在高并发时候的效率。    缺点是LongAdder在统计的时候如果有并发更新,可能导致统计的数据有误差。

    37010发布于 2021-02-25
  • 来自专栏CSDN文章

    LongAdder的源码学习与理解

    ‍个人主页: 才疏学浅的木子 ‍♂️ 本人也在学习阶段如若发现问题,请告知非常感谢 ‍♂️ 本文来自专栏: Java基础 LongAdder 有了AtomicLong为什么还要LongAdder LongAdder中的主要方法 // 累加单元组,懒惰初始化 transient volatile Cell[] cells; // 基础值,如果没有竞争,则用cas累加这个值 transient 注解就是用来解决这个问题,它的原理是在适用此注解的对象或字段的前后各增加128字节大小的padding,从而让CPU将对象预读至缓存时占用不同的缓存行,这样就不会造成对方的缓存行失效 有了AtomicLong为什么还要LongAdder 既然AtomicLong性能问题是由于多线程同时去竞争同一个变量的更新而降低,那么把一个变量分解为多个变量,让同样多的线程去竞争多个资源 LongAdder在内部维护了一个Cells数组,每个 最后当获取当前值的时候把所有变量的值累加后再加上base的值返回 Cells占用内存相对比较大的所以一开始并不创建,而是在需要时候再创建,也就是惰性加载,当一开始没有空间的时候,所有的更新都是操作base变量 LongAdder

    38920编辑于 2022-11-13
  • 来自专栏悟道

    LongAdder源码【原创+图解+视频讲解】

    目录 AtomicLong用法 源码分析 问题 解决 LongAdder用法 高并发下效率测试 原理 源码 add(long x) Striped64的longAccumulate   伪共享 总结 视频讲解 如果在竞争激烈的情况下,CAS 操作不断的失败,就会有大量的线程不断的自旋尝试 CAS 会造成 CPU 的极大的消耗 解决 使用LongAdder LongAdder用法       LongAdder longAdder = new LongAdder();        longAdder.increment();        longAdder.add(10);        longAdder.sum longAdder = new LongAdder();            List<Thread> list = new ArrayList();            for (int i 视频讲解: 代码看不懂,请看我讲解的视频哈链接: 【总结者】LongAdder源码讲解(图解+代码逐行分析)4K面试必看_哔哩哔哩_bilibili

    54830编辑于 2023-01-06
  • 来自专栏写点吧

    关于Atomic系列与LongAdder的性能差距

    一般并发场景下,使用Atomic其实是问题不大,但如果是并发量非常恐怖,LongAdder爆发的威力是非常强大的。 class LongAdderTest {// private static AtomicLong counter = new AtomicLong(); private static LongAdder counter = new LongAdder(); private static ExecutorService executorService = Executors.newFixedThreadPool 最后LongAdder高性能主要还是引入了数组对并发更新的负载,说白了,就是分摊出来计算。到这里,你可以想想ConcurrentHashMap怎么实现高并发下的元素计数了。

    52911编辑于 2022-07-10
  • 来自专栏java 微风

    java 并发包之 LongAdder 源码分析

    原理 LongAdder的原理是,在最初无竞争时,只更新base的值,当有多线程竞争时通过分段的思想,让不同的线程更新不同的段,最后把这些段相加就得到了完整的LongAdder存储的值。 ? add(x)方法 add(x)方法是LongAdder的主要方法,使用它可以使LongAdder中存储的值增加x,x可为正可为负。 ? 答案确实如此,所以LongAdder可以说不是强一致性的,它是最终一致性的。 LongAdder VS AtomicLong 当只有一个线程的时候,AtomicLong反而性能更高,随着线程越来越多,AtomicLong的性能急剧下降,而LongAdder的性能影响很小。 总结 (1)LongAdder通过base和cells数组来存储值; (2)不同的线程会hash到不同的cell上去更新,减少了竞争; (3)LongAdder的性能非常高,最终会达到一种无竞争的状态;

    56610发布于 2020-03-18
  • 来自专栏彤哥读源码

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

    ---- 问题 (1)java8中为什么要新增LongAdder? (2)LongAdder的实现方式? (3)LongAdder与AtomicLong的对比? 原理 LongAdder的原理是,在最初无竞争时,只更新base的值,当有多线程竞争时通过分段的思想,让不同的线程更新不同的段,最后把这些段相加就得到了完整的LongAdder存储的值。 ? add(x)方法 add(x)方法是LongAdder的主要方法,使用它可以使LongAdder中存储的值增加x,x可为正可为负。 :10000000LongAdder elapse:840msAtomicLong elapse:10506msthreadCount:80, times:10000000LongAdder elapse 总结 (1)LongAdder通过base和cells数组来存储值; (2)不同的线程会hash到不同的cell上去更新,减少了竞争; (3)LongAdder的性能非常高,最终会达到一种无竞争的状态;

    47720发布于 2019-07-08
  • 来自专栏JAVA核心

    深入解析Java并发库(JUC)中的LongAdder

    LongAdder常用于需要高并发更新的统计和计数场景。 一、LongAdder的使用 下面代码展示了如何在多线程环境中使用LongAdder来统计并发任务的执行次数,并最终获取总的执行次数。 二、LongAdder的性能优势 与AtomicLong相比,LongAdder在高并发场景下的性能优势主要体现在以下几个方面: 减少线程间的竞争:LongAdder内部维护了多个变量,每个线程对其中一个变量进行操作 这使得在高并发场景下,LongAdder的性能优于AtomicLong。 适用于统计和计数场景:LongAdder适用于统计和计数场景,如记录某个方法的调用次数、统计某个事件的发生次数等。 三、LongAdder的实现原理 LongAdder的实现原理是基于分段锁和并发控制的思想,通过内部维护多个变量来减少线程间的竞争,从而提高并发性能。下面我们将深入分析LongAdder的实现原理。 因此,在选择使用LongAdder还是AtomicLong时,需要根据实际需求进行权衡和选择。 总之,LongAdder通过分段锁和并发控制的思想实现了高并发场景下的长整型加法操作优化。

    99210编辑于 2024-03-21
  • 来自专栏服务端思维

    LongAdder 中窥见并发组件的设计思路

    LongAdder 解决方案 通过阅读 LongAdder 的 Javadoc 我们了解到: This class is usually preferable to {@link AtomicLong} 大概意思就是,LongAdder 功能类似 AtomicLong ,在低并发情况下二者表现差不多,在高并发情况下 LongAdder 的表现就会好很多。 LongAdder 的实现细节 虽然原理简单粗暴,但是代码写得却相当细致和精巧。 在 java.util.concurrent.atomic 包下面我们可以看到 LongAdder 的源码。 LongAdder 余下的方法就比较简单,没有什么可以讨论的了。 LongAdder VS AtomicLong 看上去 LongAdder 性能全面超越了 AtomicLong。 其实我们可以发现,LongAdder 使用了一个 cell 列表去承接并发的 cas,以提升性能,但是 LongAdder 在统计的时候如果有并发更新,可能导致统计的数据有误差。

    60000发布于 2019-07-11
  • 来自专栏屈定‘s Blog

    (转)比AtomicLong还高效的LongAdder源码解析

    言归正传,为什么说LongAdder引起了我的注意,原因有二: 作者是Doug lea ,地位实在举足轻重。 他说这个比AtomicLong高效。 因此,我决定研究下,为什么LongAdder比AtomicLong高效。 首先,看LongAdder的继承树: ? 继承自Striped64,这个类包装了一些很重要的内部类和操作。稍候会看到。 没错,并发的时候,好戏开始了,AtomicLong的处理方式是死循环尝试更新,直到成功才返回,而LongAdder则是进入这个分支。 LongAdder给了我们一个非常容易想到的解决方案: 减少并发,将单一value的更新压力分担到多个value中去,降低单个value的 “热度”,分段更新!!! 和AtomicLong性能差不多,高并发时LongAdder更高效!

    92730发布于 2018-09-27
  • 来自专栏从码农的全世界路过

    Long型原子操作之AtomicLong与LongAdder

    LongAdder JDK8中, 为优化AtomicLong在高并发下的低效问题, 引入了一个新的Long型原子操作类LongAdder, 它比AtomicLong拥有更好的性能, 当然代价就是消耗更多的空间 数据写入 在LongAdder中数据是其父类Striped64中的两个变量base, cells[]共同存储的. /** * Table of cells. 与AtomicLong的比较 LongAdder和AtomicLong虽都能实现对long型数字的计数, 但他们还是有些区别的. 1. 从API上说, LongAdder只提供了加1和减1的相关方法, 而AtomicLong可以处理任意数, 使用上也更灵活, 也提供了更多的使用方式. 2. 从性能上说, 在并发量高的情况下, LongAdder造成锁的概率更低, 性能更高, 但在get时可能有误差. 一般情况下, AtomicLong都是可以满足性能需要的.

    60310编辑于 2022-06-20
  • 来自专栏JavaEdge

    Java8 原子弹类之LongAdder源码分析add使用场景LongAdder是否能够替换AtomicLong

    */ transient volatile int cellsBusy; 从以上分析来看,longAccumulate就是为了尽量减少多个线程更新同一个value,实在不行则扩大cell LongAdder 因为LongAdder在更新数值时并非对一个数进行更新,而是分散到多个cell,这样在多线程的情况下可以有效的嫌少冲突和压力,使得更加高效。 使用场景 适用于统计求和计数的场景,因为它提供了add、sum方法 LongAdder是否能够替换AtomicLong 从上面的分析来看是不行的,因为AtomicLong提供了很多cas方法,例如getAndIncrement 、getAndDecrement等,使用起来非常的灵活,而LongAdder只有add和sum,使用起来比较受限。

    1.7K60发布于 2018-05-16
  • 来自专栏JVMGC

    线程安全之原子性Atomic(AtomicInteger|LongAdder|AtomicLong)

    count=new LongAdder(); public static void main(String[] args) { ExecutorService executorService [LongAdder] 对于普通类型的Long和Doubble变量,JVM允许将64位的读操作或写操作拆成两个三十二位的操作。 LongAdder在AtomicLong的基础上将单点的更新压力分散到各个节点,在低并发的时候通过对base的直接更新可以很好的保障和AtomicLong的性能基本保持一致,而在高并发的时候通过分散提高了性能 缺点是LongAdder在统计的时候如果有并发更新,可能导致统计的数据有误差。 其他情况下,比如序列号生成,这种情况下需要准确的数值,全局唯一的AtomicLong才是正确的选择,而不是LongAdder [wx.jpg]

    1.1K00发布于 2021-01-09
领券