LongAdder功能和原理

AtomicLong能保证并发情况下计数的准确性,其内部通过CAS来解决并发安全性的问题。
AtomicLong的缺点:
可以看到在高并发情况下,当有大量线程同时去更新一个变量,任意一个时间点只有一个线程能够成功,绝大部分的线程在尝试更新失败后,会通过自旋的方式再次进行尝试,这样严重占用了CPU的时间片,进而导致系统性能问题。

LongAdder在【高并发】的场景下会比AtomicLong具有更好的性能,代价是消耗更多的内存空间。

工作原理

1LongAdder设计思想上,采用分段的方式降低并发冲突的概率。通过维护一个基准值【base】和【Cell数组】2、当没有出现多线程竞争的情况,线程会直接对base里面的value进行修改,这个操作其实和AtomicLong操作是一样的。
3、当多线程的时候,那么LongAdder会初始化一个cell数组,然后对每个线程获取对应的hash值,之后通过hash & (size -1)[size为cell数组的长度]
将每个线程定位到对应的cell单元格,之后这个线程将值写入对应的cell单元格中的value,之后将所有【cell单元格的value】和【base中的value】进行累加求和得到最终的值。并且每个线程竞争的Cell的下标不是固定的,如果CAS失败,会重新获取新的下标去更新,从而极大地减少了CAS失败的概率。缺点:只能用做计数器,如果要获取总数,他是通过累加多个数组的值进行相加的,所以不是原子性的操作,实时获取值不一定准确。

在这里插入图片描述
当需要拿到总数时 =base+cell[0]+cell[1]+cell[2]+cell[3]+…

LongAdder和AtomicLong性能对比

下面是记录1个线程,分别通过LongAdderAtomicLong计算从0累加到100000000,耗时对比。treadCount表示线程数:线程一次从1增加到80个。结论:
11个线程时速度是最快的。并且AtomicLongLongAdder还要快。
2、多个线程执行的情况下,单个线程执行的效率是最高的。
3、多个线程执行的情况下,LongAdder要快很多。
所以这也是在高并发下syn....性能很高的原因。因为AtomicLong里面还有很多无用的for自选操作。

在这里插入图片描述

源码

在这里插入图片描述

在这里插入图片描述

拓展

高并发的场景下,通过这种思想,还可以把同一个商品库存拆分多条数据,一条数据拆成多条数据,就变成了1个行锁,变成了多个行锁。
比如下面这种一张表里面同一个商品Id,通过多行数据记录库存,总库存等于各行库存之后,当请求进来,通过路由策略,选择扣减指定行的库存,
这样就极大的增加了并发能力,而且就算路由到某行数据因为库存为0,但是总库存不为0,这样也没关系,因为高并发下,速度是很快的,所以也可以忽略。
当然也可以通过一些方式让库存为0的行,不参与并发的扣减

在这里插入图片描述

原文链接:跳转

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

自动驾驶学习笔记(十)——Cyber通信

#Apollo开发者# 学习课程的传送门如下,当您也准备学习自动驾驶时,可以和我一同前往: 《自动驾驶新人之旅》免费课程—> 传送门 《Apollo Beta宣讲和线下沙龙》免费报名—>传送门 文章目录 前言 Cyber通信 编写代码 编译程序 运行…

FISCOBCOS入门(十)Truffle测试helloworld智能合约

本文带你从零开始搭建truffle以及编写迁移脚本和测试文件,并对测试文件的代码进行解释,让你更深入的理解truffle测试智能合约的原理,制作不易,望一键三连 在windos终端内安装truffle npm install -g truffle 安装truffle时可能出现网络报错,多试几次即可 truffle --vers…

人力资源小程序

人力资源管理对于企业的运营至关重要,而如今随着科技的发展,制作一个人力资源小程序已经变得非常简单和便捷。在本文中,我们将为您介绍如何通过乔拓云网制作一个人力资源小程序,只需五个简单的步骤。 第一步:注册登录乔…

基于单片机的自动循迹小车(论文+源码)

1.系统设计 此次基于单片机的自动循迹小车的设计系统,结合循迹模块来共同完成本次设计,实现小车的循迹功能,其其整体框架如图2.1所示。其中,采用STC89C52单片机来作为核心控制器,负责将各个传感器等模块链接起来&…

四旋翼无人机的飞行原理--【其利天下分享】

近年来,无人机在多领域的便捷应用促使其迅猛的发展,如近年来的多场战争,无人机的战场运用发挥得淋漓尽致。 下面我们针对生活中常见的四旋翼无人机的飞行原理做个基础的介绍,以飨各位对无人机有兴趣的朋友。 一:四旋翼…

基于变形卷积和注意机制的带钢表面缺陷快速检测网络DCAM-Net(论文阅读笔记)

原论文链接->DCAM-Net: A Rapid Detection Network for Strip Steel Surface Defects Based on Deformable Convolution and Attention Mechanism | IEEE Journals & Magazine | IEEE Xplore DCAM-Net: A Rapid Detection Network for Strip Steel Surface Defects Base…

1334. 阈值距离内邻居最少的城市/Floyd 【leetcode】

1334. 阈值距离内邻居最少的城市 有 n 个城市,按从 0 到 n-1 编号。给你一个边数组 edges,其中 edges[i] [fromi, toi, weighti] 代表 fromi 和 toi 两个城市之间的双向加权边,距离阈值是一个整数 distanceThreshold。 返回能通过某些路径…

Ubuntu18.04安装ROS系统+turtle测试

安装 1.设置安装源 sudo sh -c echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list sudo sh -c . /etc/lsb-release && echo "deb http://mirrors.tuna.tsinghua.edu.cn/ros/ubun…

linux网络编程之TCP协议编程

Linux网络编程之TCP协议编程 tcp协议编程模型socket函数sockaddr_inbindlistenconnect 应用服务端代码客服端代码 TCP协议编程) tcp协议编程模型 Server 1.创建socket (socket函数) 2.确定服务器协议地址簇 (struct sockaddr) 3.绑定 (bind) 4.监听 ( listen) 5.接受客户端连接…

【并发编程】Synchronized的使用

📫作者简介:小明java问道之路,2022年度博客之星全国TOP3,专注于后端、中间件、计算机底层、架构设计演进与稳定性建设优化,文章内容兼具广度、深度、大厂技术方案,对待技术喜欢推理加验证,就职于…

C进阶---文件操作

我们在日常使用电脑保存文件时,其目的就是为了便于以后查看、修改、更新等操作;保存在文件中可以使数据持久化,所以今天我们家里学习文件的相关操作。 一、文件 1.1什么是文件 磁盘上的文件是文件。 在程序设计中,文件一般分…

验证码案例 —— Kaptcha 插件介绍 后端生成验证码,前端展示并进行session验证(带完整前后端源码)

🧸欢迎来到dream_ready的博客,📜相信你对这篇博客也感兴趣o (ˉ▽ˉ;) 📜表白墙/留言墙 —— 中级SpringBoot项目,MyBatis技术栈MySQL数据库开发,练手项目前后端开发(带完整源码) 全方位全步骤手…

了解一下知识付费系统的开发流程和关键技术点

知识付费系统的开发既涉及到前端用户体验,又需要强大的后端支持和复杂的付费逻辑。在这篇文章中,我们将深入探讨知识付费系统的开发流程和关键技术点,并提供一些相关的技术代码示例。 1. 需求分析和规划: 在着手开发知识付费系…

Spring Cloud Stream实践

概述 不同中间件,有各自的使用方法,代码也不一样。 可以使用Spring Cloud Stream解耦,切换中间件时,不需要修改代码。实现方式为使用绑定层,绑定层对生产者和消费者提供统一的编码方式,需要连接不同的中间…

8、创建第一个鸿蒙页面并实现页面跳转

一、创建页面 1、新建页面 在项目的"pages"目录上右键,选择”新建“——”page" 2、录入页面的名称 在“Page name”中输入页面的名称,并点击“Finish”完成创建 3、以下为创建的新页面 2、注册页面 新建的页面会自动在“resources”…

一起Talk Android吧(第五百五十五回:Retrofit中的注解)

文章目录 1. 概念介绍2. 注解的分类与功能2.1 方法类注解2.2 参数类注解3. 内容总结各位看官们大家好,上一回中分享了一个Retrofit使用错误的案例,本章回中将 介绍Retrofit请求中的注解。闲话休提,言归正转,让我们一起Talk Android吧! 1. 概念介绍 我们在前面章回中介绍R…

二十、虚拟机网络配置

1、Linux网络配置原理 我自己Linux虚拟机的IP地址是:192.168.159.131 vmnet8:192.168.159.1 无线网卡:192.168.159.1 2、查看网络IP和网关 查看虚拟网络编辑器和修改IP地址 如果把这个位置的子网IP换成:192.168.8.0的话重启虚拟机…

【2023云栖】陈守元:阿里云开源大数据产品年度发布

本文根据 2023 云栖大会演讲实录整理而成,演讲信息如下: 演讲人:陈守元 | 阿里云计算平台事业部开源大数据产品总监 演讲主题:阿里云开源大数据产品年度发布 随着云计算的不断发展,未来数据处理和应用的趋势将围绕C…

ES6中实现继承

本篇文章主要说明在ES6中如何实现继承,学过java的小伙伴,对class这个关键字应该不陌生,ES6中也提供了class这个关键字作为实现类的语法糖,咱们一起实现下ES6中的继承。 实现思路 首先直接通过class来声明一个Teacther类&#xff…

SpringCloud微服务通信两种方式Feign和Dubbo:Feign基本使用、自定义配置、使用优化;Dubbo基本实现

RestTemplate存在的问题 代码可读性差,编程体验不统一参数复杂,URL难以维护 Feign远程调用 Feign简介 ​ Feign是SpringCloud提供的一个声明式的伪Http客户端,它使得调用远程服务就像调用本地服务一样简单,只需要创建一个接口…