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应该更适用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/506345.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python版【植物大战僵尸 +源码】

文章目录 写在前面&#xff1a;功能实现环境要求怎么玩个性化定义项目演示&#xff1a;源码分享Map地图:Menubar.py主菜单 主函数&#xff1a;项目开源地址 写在前面&#xff1a; 今天给大家推荐一个Gtihub开源项目&#xff1a;PythonPlantsVsZombies&#xff0c;翻译成中就是…

小程序开发调试指南

调试指南 一、Vconsole 一些线上问题需要在真机中进行调试或日志输出&#xff0c;为方便查看前端日志的输出&#xff0c;App 端提供了调试模式, 打开调试模式后面板界面中会显示 vConsole 按钮&#xff0c;点击后可打开手机端 vConsole界面查看日志输出。 1.如何开启 点击小…

JumpServer 堡垒主机

JumpServer 堡垒机帮助企业以更安全的方式管控和登陆各种类型的资产 SSH&#xff1a;Linux/Unix/网络设备等Windows&#xff1a;Web方式连接/原生RDP连接数据库&#xff1a;MySQL、Oracle、SQLServer、PostgreSQL等Kubernetes&#xff1a;连接到K8s集群中的PodsWeb站点&#x…

复现黄金票据

一、搭建环境 搭建域环境可以点击这个查看步骤 在这里面monowall的配置查看 二、实验步骤 拿到域名 拿到SID 使用mimikatz拿到krbtgt用户的哈希 删除票据 也可以使用mimikatz.exe删除票据&#xff0c;命令是kerberos::purge 伪造票据 拿到域控 伪造成功

物联网实战--入门篇之(六)嵌入式-WIFI驱动(ESP8266)

目录 一、WIFI简介 二、基础网络知识 三、思路讲解 四、代码分析 4.1 状态机制 4.2 客户端连接 4.3 应用数据接收处理 4.4 数据发送 4.5 主函数调用 4.6 网络连接ID分配 五、总结 一、WIFI简介 WIFI在我们生活中太常见了&#xff0c;手机电脑都可以用WiFi连接路由器进行上…

MySQL核心命令详解与实战,一文掌握MySQL使用

文章目录 文章简介演示库表创建数据库表选择数据库删除数据库创建表删除表向表中插入数据更新数据删除数据查询数据WHERE 操作符聚合函数LIKE 子句分组 GROUP BY HAVINGORDER BY(排序) 语句LIMIT 操作符 分页查询多表查询-联合查询 UNION 操作符多表查询-连接的使用-JOIN语句编…

从0到1手把手撸码搭建后台管理系统

从0到1手把手撸码搭建后台管理系统 第一章:系统介绍开发目的与过程 要使用 Vue3 搭建后台&#xff0c;你可以按照以下步骤进行&#xff1a; 安装 Vue3&#xff1a;使用包管理工具&#xff08;如 npm 或 yarn&#xff09;安装 Vue3。选择构建工具&#xff1a;选择一个适合的构…

Spring之循环依赖

什么是循环依赖? 依赖的相互引用,如下列的这种形式 Component public class A {Autowiredprivate B b;}Component public class B {Autowiredprivate A a; } Spring是如何解决循环依赖的 Spring是通过三级缓存来解决循环依赖 singletonObjects : 单例bean,已经实例化,完成…

非周期连续函数的傅里叶变换

首先 我们把一个非周期信号扩展成一个周期信号 然后用傅里叶级数展开 也可以得到对应的级数系数 利用周期趋向于无穷大 可以把傅里叶级数展开就变成了一个积分 而神奇的是积分里其实还有一个积分 这样我们就得到了傅里叶变换对 我们把里面的积分成为函数的傅里叶变换 把外面…

C语言交换二进制位的奇数偶数位

基本思路 我们要先把想要交换的数的二进制位给写出来假如交换13的二进制位&#xff0c;13的二进制位是 0000 0000 0000 0000 0000 0000 0000 1101然后写出偶数位的二进制数&#xff08;偶数位是1的&#xff09; 1010 1010 1010 1010 1010 1010 1010 1010然后写出奇数位的二进…

Mac通过Idea启动Tomcat时出现Cannot run program xxx/catalina.sh 错误

问题描述 Mac通过Idea启动Tomcat时出现Cannot run program xxx/catalina.sh错误&#xff0c;详细如下&#xff1a; Error running Tomcat9 Cannot run program "/Users/xxx/Desktop/work/devtools/apache-tomcat-9.0.19/bin/catalina.sh" (in directory "/U…

算法设计课第一周(排序算法的效率分析)

实验1 排序算法的效率分析 一、【实验目的】 &#xff08;1&#xff09;复习排序算法的实现过程&#xff1b; &#xff08;2&#xff09;设计平均与最坏情况下时间复杂度的数据环境并理解相关含义&#xff1b; &#xff08;3&#xff09;初步了解算法时间复杂度的分析方法。…

FlashFace:一种高保真身份保存的人类形象个性化方法

FlashFace技术是由香港大学、阿里巴巴集团、蚂蚁集团共同研发的一项实用工具&#xff0c;用户可以通过提供一张或几张参考面部图像和文本提示&#xff0c;就可以轻松地即时个性化自己的相片。 与现有的人像定制方法相比&#xff0c;FlashFace方法具有更高保真度的身份保留xi性…

【spring】Spring Cloud Alibaba版本发布说明

Spring Cloud Alibaba版本发布说明 由于 Spring Boot 3.0&#xff0c;Spring Boot 2.7~2.4 和 2.4 以下版本之间变化较大&#xff0c;目前企业级客户老项目相关 Spring Boot 版本仍停留在 Spring Boot 2.4 以下&#xff0c;为了同时满足存量用户和新用户不同需求&#xff0c;社…

Vue 组件化编程

Vue 组件化编程 非单文件组件 定义组件 使用Vue.extend(options&#xff09;创建 不要写eldata要写成函数&#xff0c;避免组件被复用时&#xff0c;数据存在引用关系 注册组件 局部注册&#xff1a;new Vue()的时候&#xff0c;options传入components全局注册&#xff1a;V…

Linux 个人笔记之三剑客 grep sed awk

文章目录 零、预一、grep 文本过滤工具基础篇实战篇 二、sed 字符流编辑器基础篇实战篇 三、awk 文本处理工具基础篇实战篇 四、附xargsuniq & sort基础篇实战篇 cut 零、预 bash 的命令行展开 {} $ echo file_{1..4} file_1 file_2 file_3 file_4$ echo file_{a..d} file_…

高等数学基础篇(数二)之多元函数的基本概念

多元函数基本概念&#xff1a; 一、多元函数的极限 二、多元函数的连续性 三、偏导数 四、全微分 目录 一、多元函数的极限 二、多元函数的连续性 三、偏导数 1.偏导数的定义 2.二元函数偏导数的几何意义 3.高阶偏导数 四、全微分 补充&#xff1a; 一元函数极限连…

BIONIOAIO

通信技术整体解决的问题 1.局域网内的通信要求 2.多系统间的底层消息传递机制 3.高并发下&#xff0c;大数据量的通信场景需要 4.游戏行业。无论是手游服务端、还是大型网络游戏&#xff0c;java的应用越来越广 IO模型基本说明 就是用什么样的通道或者说是通信模式和架构…

数学逻辑专题

数学专题 分治篇LeetCode 263. 丑数解题思路代码实现总结 不要纠结&#xff0c;干就完事了&#xff0c;熟练度很重要&#xff01;&#xff01;&#xff01;多练习&#xff0c;多总结&#xff01;&#xff01;&#xff01; 分治篇 LeetCode 263. 丑数 解题思路 为判断 nnn 是否…

前端实现菜单搜索搜索(功能模版)

目录 前言正文 前言 总体界面如下所示&#xff1a; 正文 <template><div class"avue-searchs"click.self"handleEsc"><div class"avue-searchs__title">菜单搜索</div><div class"avue-searchs__content"…