(5)并发编程高级篇-AtomicLong、LongAdder、LongAccumlator

JAVA AtomicLong 实现循环自增流水号 java Atomiclong 实现循环自增流水号 阅读详情

Java的JUC包下提供了很多的原子性操作类,都是通过非阻塞的CAS操作来实现的,相比于用锁的方式来实现原子性操作上性能有较大的提升,本篇主要着重讲解简单的AtomicLong类以及JDK1.8新增的LongAdder、LongAccumulator类,至于其他的类都大同小异,明白其原理去理解其他的并不难。

AtomicLong类

原子性操作类的底层都是用Unsafe类进行实现的,我们看下面的AtomicLong类代码:

    static {
        try {
            valueOffset = unsafe.objectFieldOffset
                (AtomicLong.class.getDeclaredField("value"));
        } catch (Exception ex) { throw new Error(ex); }
    }

    private volatile long value;

AtomicLong静态代码块的初始化,通过Unsafe工具类获取自身的value 内存偏移量,我们发现value 用了volatile关键字,是因为要保证该变量在内存的可见性。
我们再来看AtomicLong类的几个自增和自减的操作方法:

   /**
     * 自增当前的值
     *
     * @return 先前的值
     */
    public final long getAndIncrement() {
        return unsafe.getAndAddLong(this, valueOffset, 1L);
    }

    /**
     * 自减当前的值
     *
     * @return 先前的值
     */
    public final long getAndDecrement() {
        return unsafe.getAndAddLong(this, valueOffset, -1L);
    }
     /**
     * 自增当前的值
     *
     * @return 自增后的值
     */
    public final long incrementAndGet() {
        return unsafe.getAndAddLong(this, valueOffset, 1L) + 1L;
    }

    /**
     * 自减当前的值
     * @return 自增后的值
     */
    public final long decrementAndGet() {
        return unsafe.getAndAddLong(this, valueOffset, -1L) - 1L;
    }

如上代码自增、自减操作都是通过unsafe的getAndLong方法实现的,此方法是原子性操作,由底层硬件CAS指令完成的。其中 第一个参数:当前AtomicLong的实例,第二个参数:value值的内存偏移地址,第三个参数:自增的值。

本源码为JDK1.8,此源码和JDK1.7有所不同,但底层实现逻辑是一样,jdk1.8 将jdk1.7中重试更新value值的源码实现放到了getAndLong内部方法中。

虽然AtomicLong采用了非阻塞的CAS算法 来实现 原子性的操作 比 通过锁机制来实现的性能有所提高,但是在高性能并发的情况下,它还是会存在性能问题的,即高并发的情况下会有多个线程同时竞争更新一个原子变量,更新失败的线程会自旋进行重试。jdk1.8 提供了一个性能更高的LongAdder 类,下面我们继续看它。

LongAdder

LongAdder 内部维护了一组cell ,每个cell 维护了一个初始值为0的long型值。多线程并发的时候,所有线程并不是单独操作一个cell,而是各线程分配到各cell中去。另外,当多个线程同时争夺同一个cell失败后,并不会就当前的cell进行自旋的CAS操作,而是分配到其他的cell进行CAS尝试,这增加了CAS成功的可能性。当获取值的时候,会累加所有cell变量中的value值。

LongAccumlator

它比LongAdder提供能更强大的API。

多线程-Synchronized、AtomicLong、LongAdder、LongAccumulate性能对比及LongAdder简介 class ClickNum{ int number = 0; public synchronized void addInSynchr(){ number++; } AtomicLong atomicLong =new AtomicLong(); public void addInAtomicLong(){ atomicLong.incrementAndGet(); } LongAdder longAdder = 阅读详情

相关推荐

【高并发】JUC中原子类介绍

1.概述 转载: 添加链接描述 2.什么是原子操作? atomic 翻译成中文是原子的意思。在化学上,我们知道原子是构成一般物质的最小单位,在化学反应中是不可分割的。在我们这里 atomic 是指一个操作是不可中断的。即使是在多个线程一起执行的时候,一个操作一旦开始,就不会被其他线程干扰,所以,所谓原子类说简单点就是具有原子操作特征的类,原子操作类提供了一些修改数据的方法,这些方法都是原子操作的,在多线程情况下可以确保被修改数据的正确性。 JUC中对原子操作提供了强大的支持,这些类位于java.util..

九师兄 1065

Java LongAccumulator原子累加器源码深度解析

基于JDK1.8详细介绍了JUC下面的LongAccumulator原子类源码和原理,LongAccumulator是Java8对于原子类的增强。

终生学习践行者 1420

帕塞瓦尔定理(Parseval‘s theorem)的证明

帕塞瓦尔定理(Parseval's theorem)表明了信号在时域和频域上的能量相等。

weixin_42428226的博客 2万+

【AtomicLong】常规用法

无参构造,相当于AutomicLong(0L)有参构造,初始化为initValue类比AtomicInteger:getAndIncrement先返回现值,后自增1incrementAndGet先自增1,后返回值类比AtomicInteger:getAndDecrement先返回现值,后自减1decrementAndGet先自减1,后返回值public boolean compareAndSet(long source, long dest):source是改之前的值,Dest是改之后的值,source与当

『程序员·小李』的博客 2525

集成电路模拟版图入门-版图基础学习笔记(四)

第三部分:版图的准备 2. 设计规则 3) Design Rule 2. 设计规则 4) 规则定义 4.1 NW(N WELL) 2. 设计规则 4) 规则定义 4.1 NW(N WELL) 2. 设计规则 4) 规则定义 4.2 PO(Poly) 2. 设计规则 4) 规则定义 4.3 M1(Metal1) 2. 设计规则 4) 规则定义 4.4 VIA 3. DRC文件 3.1 DRC:Design Rule Check,设计规则检查。 3.2 DRC程序了解有关

weixin_52955333的博客 6736

汽车底盘技术解析:从悬架调校到智能化,如何评价国产车底盘实力

汽车底盘作为决定车辆驾驶质感、安全性和耐久性的核心系统,其技术内涵远不止于悬架结构。从行驶系、转向系到制动系的协同工作,底盘调校是一门融合机械原理与工程实践的艺术。在电动化与智能化浪潮下,底盘技术正经历从被动适应到主动响应的变革,CDC可变阻尼减震器和空气悬架等技术的应用,让底盘具备了通过OTA升级实现性能优化的可能。国产汽车品牌如奇瑞、吉利等,通过平台化架构研发与调校经验积累,正推动底盘技术从“能用”向“好用”乃至“塑造独特驾驶风格”迈进。理解底盘技术,需超越简单的结构对比,关注其在实际路况中的滤震性、支

weixin_34413103的博客 386

LongAccumulator介绍,使用,原理

LongAccumulator类原理探究 LongAdder类时LongAccumulator的一个特例,LongAccumulator比LongAdder的功能更强大。例如下面的构造函数,其中accumulatorFunction是一个双目运算器接口,其根据输入的两个参数返回一个计算值,identity则是LongAccumulator累加器的初始值。 public LongAccumulato...

小铛D的博客 3914

E4A蓝牙APP开发实战:从零到一构建简易物联网控制终端

本文详细介绍了使用E4A(易安卓)开发蓝牙APP的实战教程,从零开始构建简易物联网控制终端。通过E4A的中文编程环境和内置蓝牙组件,开发者可以快速实现智能家居控制、创客项目遥控等功能。文章涵盖硬件准备、开发环境搭建、核心代码解析及典型应用场景,特别适合零Java基础的电子爱好者入门蓝牙APP开发。

weixin_42715608的博客 475

4.原子操作类:AtomicLong、LongAdderLong、Accumulator

JUC包中有AtomicInteger、AtomicLong和AtomicBoolean等原子性操作类,它们原理类似,下面以AtomicLong为例进行讲解。 递增和递减操作代码 上述代码中,valueOffset为AtomicLong在static语句块中进行初始化时通过。可以看到,上述四个方法都是(原子性操作)实现的。 AtomicLong使用示例 AtomicLong使用CAS非阻塞算法,性能比使用synchronized等的阻塞算法实现同步好很多。但在高并发下,大量线程会同时去竞争更新同一个原

页页的博客 712

十四种逻辑器件综合对比——《器件手册--逻辑器件》

逻辑器件是数字电路中最基本的逻辑单元,用于实现基本的逻辑运算,如与、或、非、异或等。逻辑门根据输入信号的组合产生相应的输出信号。与门:只有当所有输入信号都为高电平时,输出才为高电平。或门:只要有一个输入信号为高电平,输出就为高电平。非门:输出信号与输入信号相反。异或门:当两个输入信号不同时,输出为高电平;相同则输出为低电平。用于对输入信号进行反相操作,即将高电平转换为低电平,低电平转换为高电平。常用于信号的反相处理和逻辑电平的转换。

XU157303764的博客 2030

杰理可视化SDK开发-杰理AC1123N芯片SDK开发笔记合集

该文档主要描述 AC112N开发相关的使用说明和注意事项,收集并持续更新开发调试过程中的相关疑问和解答,对SDK介绍文档做一个补充说明。写作人:李永奉,参考项目MD-026H; AC112N-SDK项目帮助文档在杰理开发者平台(JL DP)'帮助'处进入,如本文档有与后续帮助文档或工具注释说明冲突,以后者为标准。

李永奉的博客 181

高并发下的计数器实现方式:AtomicLong、LongAdder、LongAccumulator

计数器是并发编程中非常常见的一个需求,例如统计网站的访问量、计算某个操作的执行次数等等。在高并发场景下,如何实现一个线程安全的计数器是一个比较有挑战性的问题。本文将介绍几种常用的计数器实现方式,包括AtomicLong、LongAdder和LongAccumulator,并深入讲解其中的CAS操作。

weixin_40381772的博客 4283

PINN物理信息网络 | 非线性薛定谔方程的物理信息神经网络

PINN物理信息网络 | 非线性薛定谔方程的物理信息神经网络

算法如诗的博客 1299

SpringBoot 使用redis RedisAtomicLong生成自增的ID值

RedisSequenceFactory是一个简单封装类,用于使用redisTemplate生成自增ID值。编写一个编号生成的规则类。

hikktn的博客 1855

Sigrity System SI Parallel Bus Analysis模式进行DDR3仿真分析操作指导-单个颗粒

Default Strobe Offset:DQS默认偏移时间,自动填充为0.5ns,即DQS默认偏移1/2UI,DQS滞后于DQ 1/2UI,让建立保持时间均分。WLO:写平衡偏移的数值,DataL是0ps,DataU是500ps,是根据WLOSkew自动定义的,可以认为是WLOSkew取整,也可以根据需要手动调整数值。注意AddCmd的UI=T,这里的Data Rate仍然是DQ的速率,并不是地址线的速率,地址线的速率=1/UI=1/2ns=0.5Gbps。

weixin_54787054的博客 366

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

第二章 Atomic类

2.1 AtomicInteger和AtomicLong AtomicInteger和AtomicLong可以实现自增或者自减的原子操作。 AtomicInteger jdk 1.8源码如下: AtomicInteger类中的方法 private static final long VALUE; //内存偏移量 static { try { VALUE = U.objectFieldOffset (At

龚礼鹏的博客 1032

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

AtomicLong和LongAdder

AtomicLong是1.5实现的long类型的原子类 long getAndIncrement(); (自增,不会保证原子性)long incrementAndGet(); (自增,保证原子性)long decrementAndGet();(自减,保证原子性)long getAndDecrement();(自减,不会保证原子性) long addAndGet(long delta); (加法,保证原子性) long getAndAdd(long delta); (加法,不会保证原...

weixin_50391597的博客 367

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

LongAdder

特性AtomicLongLongAdder并发更新性能一条变量,竞争激烈多个段,竞争分散内存使用只占用一个变量多个 Cell,占用更多内存实时性实时获取准确值获取值需 sum() 聚合适用场景并发不高或读多写少并发高、写操作频繁。

qq_46130027的博客 532

并发编程之美(第四章)

第4章 Java并发包中原子操作类原理剖析 JUC包提供了一系列的原子性操作类,这些类都是使用非阻塞算法CAS实现的,相比使用锁实现原子性操作这在性能上有很大提高。由于原子性操作类的原理都大致相同,所以本章只讲解最简单的AtomicLong类的实现原理以及JDK 8中新增的LongAdder和LongAccumulator类的原理。有了这些基础,再去理解其他原子性操作类的实现就不...

hskw444273663的博客 391

分布式系统RedisAtomicLong实现自增流水号

在项目中许多过这样的需求,记录留做备忘。需要创建一个递增序列,这个序列会提供给多个应用来使用,这样就需要保持序列的原子递增。

灵豸 1779

Java中的并发计数器LongAdder

并发计数器LongAdder基本概念 基本概念

攻城狮Chova的博客 897

循环中存放对象数组

package routingtile; import java.io.IOException; import java.io.RandomAccessFile; import java.util.ArrayList; import java.util.HashMap; import javax.swing.text.Position; public class TestMain {...

qq_25037541的博客 327

LongAdder源码分析(只分析了两个方法,add和longAccumulate,也是核心方法)

    public void add(long x) {         Cell[] as; long b, v; int m; Cell a;             if ((as = cells) != null || !casBase(b = base, b + x)) {//★三种情况,这里的cas只尝试一次,(在cells为空的情况下)失败就进去                 ...

xiaoe3504xiaoe的博客 882

(九)聊一下并发中的自增原子操作的AtomicLong在JDK1.8之后是如何优化成LongAdder的,为什么要优化自增原子类?

(一)先聊聊AtomicLong的基本概念,然后聊一下他的缺陷问题,然后引出LongAdder的优点 (1)大家都使用过AtomicInteger、AtomicLong等这几类原子性的工具类,具体怎么用我就不说了,就说一下他们的大概的基本实现原理 其实这些基本的原子操作的思想大体都是, expect 表示当前内存中你所预期望的值,update 是你想要更新的值 public fin...

王伟的博客 2591

使用RedisAtomicLong优化"访问量"性能

在每一个网站中,如果要设计访问量这个功能的话,那么将无疑会是请求量最多的接口,那么使用MySQL来进行count(*)查询明显性能就会显差了,并且这个数据要求实时,也不能作缓存,那么便需要Redis这种内存型数据库出场了。 RedisAtomicLong 这是一个spring-data-redis包中提供的,可以对数据中的Long类型进行原子性操作的类,下面是这个类的头: /** * ...

青云桑的小窝 9097
上一篇: (4)Java并发编程高级篇-ThreadLocalRandom类
下一篇: (6)并发编程高级篇-CopyOnWriteArrayList
yi博说
博客等级 码龄11年 20粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值