高并发点赞场景Synchronized、AtomicLong、LongAdder 和 LongAccumulator性能分析

在高并发点赞场景中,我们需要一个高效、线程安全的计数器来记录点赞数。synchronized、AtomicLong、LongAdder 和 LongAccumulator 都是 Java 中用于实现原子操作的类,但它们的性能在高并发下差异显著。性能主要取决于线程竞争程度:竞争越高,吞吐量(单位时间处理的操作数)和可扩展性(线程数增加时的性能表现)越关键。下面我将基于高并发点赞案例(如百万级线程同时点赞),逐步分析它们的性能特点和排名。

1. synchronized

  • 原理:使用内置锁(monitor)确保线程安全。每个点赞操作需获取锁,操作完成后释放锁。
  • 性能分析
    • 在高并发下,锁竞争激烈。线程会频繁阻塞和唤醒,导致大量上下文切换开销。
    • 吞吐量低:随着线程数增加,性能急剧下降。例如,在 100 个线程并发时,吞吐量可能降到单线程的 1/10。
    • 延迟高:操作平均耗时长,因为线程需等待锁。
    • 适用场景:低并发或简单同步任务,但不适合高并发点赞。
  • 示例代码(模拟点赞计数器)
    public class LikeCounter {private long count = 0;public synchronized void increment() {count++; // 点赞操作}public long getCount() {return count;}
    }
    

2. AtomicLong

  • 原理:基于 CAS(Compare-And-Swap)操作实现原子性,无需锁。通过硬件指令优化。
  • 性能分析
    • 比 synchronized 更好:CAS 避免了阻塞,减少了上下文切换。
    • 但在高并发下,CAS 失败率高:多个线程竞争同一变量时,需重试多次,导致 CPU 空转和缓存一致性开销。
    • 吞吐量中等:在低到中并发下表现良好,但线程数超过 CPU 核心数时,性能下降明显。例如,在 50 个线程时,吞吐量可能比 LongAdder 低 30-50%。
    • 延迟较低:但高竞争时仍不稳定。
    • 适用场景:中低并发计数器,简单原子操作。
  • 示例代码
    import java.util.concurrent.atomic.AtomicLong;public class LikeCounter {private AtomicLong count = new AtomicLong(0);public void increment() {count.incrementAndGet(); // 原子点赞操作}public long getCount() {return count.get();}
    }
    

3. LongAdder

  • 原理:Java 8 引入,使用分段(cell)机制减少竞争。每个线程操作独立的局部变量,最后通过 sum() 合并结果。
  • 性能分析
    • 高并发下最优:通过分散热点,显著降低竞争。CAS 失败率低,CPU 利用率高。
    • 吞吐量高:线程数增加时,性能可线性扩展。例如,在 100 个线程下,吞吐量可达 AtomicLong 的 2-5 倍。
    • 延迟低:操作平均耗时短,适合高频更新。
    • 缺点:sum() 方法有合并开销,但点赞场景通常读少写多,影响小。
    • 适用场景:高并发计数器如点赞、实时统计。
  • 示例代码
    import java.util.concurrent.atomic.LongAdder;public class LikeCounter {private LongAdder count = new LongAdder();public void increment() {count.increment(); // 高效点赞操作}public long getCount() {return count.sum();}
    }
    

4. LongAccumulator

  • 原理:Java 8 引入,类似 LongAdder,但支持自定义累加函数(如加法、最大值)。内部也使用分段机制。
  • 性能分析
    • 与 LongAdder 相当:在简单加法操作(如点赞的 increment)上,性能几乎相同。分段机制减少竞争。
    • 吞吐量高:可扩展性好,线程数增加时性能稳定。
    • 优势:更灵活,支持复杂操作(如累加器函数),但点赞场景只需简单加 1,因此无额外优势。
    • 延迟低:类似 LongAdder。
    • 适用场景:高并发且需自定义累加逻辑的任务,但点赞场景中性能与 LongAdder 持平。
  • 示例代码
    import java.util.concurrent.atomic.LongAccumulator;
    import java.util.function.LongBinaryOperator;public class LikeCounter {private LongAccumulator count;public LikeCounter() {LongBinaryOperator accumulator = (x, y) -> x + y; // 自定义加法函数count = new LongAccumulator(accumulator, 0);}public void increment() {count.accumulate(1); // 点赞操作}public long getCount() {return count.get();}
    }
    

性能排名分析

在高并发点赞场景(如 100+ 线程同时操作),性能从高到低排名如下:

  1. LongAdder 和 LongAccumulator(并列最佳)
    • 理由:分段机制最小化竞争,吞吐量最高(可达百万级操作/秒),延迟最低。在高线程数下可扩展性最好。
  2. AtomicLong
    • 理由:CAS 优于锁,但高竞争时重试开销导致吞吐量下降,性能次于分段类。
  3. synchronized
    • 理由:锁竞争严重,吞吐量最低(可能低于 10% 的分段类),延迟最高,不适合高并发。
关键性能指标比较(基于基准测试数据)
吞吐量(高并发下)延迟(平均操作耗时)可扩展性(线程增加时)
LongAdder非常高很低优秀
LongAccumulator非常高很低优秀
AtomicLong中等中等一般
synchronized
  • 高并发热点问题:点赞场景是“写密集型”,变量频繁更新。synchronized 和 AtomicLong 在单一变量上竞争激烈,而 LongAdder/LongAccumulator 通过分段分散竞争,减少缓存行冲突(false sharing)。
  • 实际测试数据:在 JMH 基准测试中,线程数 > 32 时,LongAdder 的吞吐量通常比 AtomicLong 高 3-10 倍,比 synchronized 高 10-50 倍。LongAccumulator 在加法操作上与 LongAdder 性能一致。
  • 推荐:对于高并发点赞的功能,优先选择 LongAdder(简单计数)或 LongAccumulator(如果需要灵活性)。避免 synchronized 和 AtomicLong 在高竞争下使用。

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

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

相关文章

postgreSQL的sql语句

目录 一:前提准备1.postgreSQL的安装可以参考我下面一片文章: 二:SQL语句 1.相同点:支持标准sql类型 2.参考详细学习地址: 3.postgresql与mysql的不同点 一:前提准备 1.postgreSQL的安装可以参考我下面…

vue3 JavaScript 数据累加 reduce

在Vue 3中,你可以使用JavaScript的reduce方法来处理数据累加。reduce方法通常用在数组上,它将数组中的每个元素通过一个累加器函数(accumulator)从左到右累积,最终生成一个单一的值。这在计算总和、累加值等场景中非常…

史上最清楚!读者,写者问题(操作系统os)

读者-写者问题是另一个里程碑式的同步互斥问题。它比生产者-消费者更复杂,因为它引入了不对称的访问权限:读者和读者之间是共享的,但写者和任何人(包括读者和其他写者)之间都是互斥的。我们用一个生动的比喻来解析这个…

使用Starrocks替换Clickhouse的理由

背景 Starrocks和clickhouse都是非常优秀的OLAP数据库,那么什么情况下使用clickhouse,什么场景下使用starrocks呢,本文就简单列举一下他们的优缺点 理由 首先两者都是列存储,并且都实现了列压缩,所以从存储中两者的压缩…

Mybatis 两级缓存可能导致的问题

Mybatis 两级缓存可能导致的问题两级缓存简介一级缓存 localCache效果开关二级缓存两级缓存可能导致的问题分布式环境下查询到过期数据事务隔离级别失效读已提交失效读未提交失效总结两级缓存简介 一级缓存 localCache 效果 一级缓存是 session 或者说事务级别的&#xff0c…

vue3+uniapp 使用vue-plugin-hiprint中实现打印效果

前言: vue3uniapp 使用vue-plugin-hiprint中实现打印效果 官网地址:gitee https://gitee.com/ccsimple/vue-plugin-hiprinthttps://gitee.com/ccsimple/vue-plugin-hiprint 实现效果: 预览打印内容: 实现步骤: 1、安…

【elementUI踩坑记录】解决 el-table 固定列 el-table__fixed 导致部分滚动条无法拖动的问题

目录一、问题背景二、 问题现象三、核心原因四、解决办法增强方案🚀写在最后一、问题背景 在使用 Element UI 的 el-table 组件时,固定列功能虽然实用,但会引发滚动条交互问题: 固定列区域悬浮显示滚动条但无法正常拖动滚动条 …

【机器人编程基础】python文件的打开和关闭

文件的打开和关闭 在Python中,文件操作是一项基本而重要的任务,涉及到打开、读取、写入、关闭文件等操作。正确地管理文件对于数据持久化、输入输出处理等至关重要。下面将详细解释如何在Python中打开和关闭文件,并提供相应的代码示例。 文件打开 在Python中,可以使用内…

ShenYu实战、问题记录

概述 一款高性能的国产的Apache开源API网关,官方文档。 在ShenYu v2.6.1, ShenYu注册中心只支持http类型,中间件注册类型已经被移除。 所以,请使用http注册类型来注册你的服务。不是微服务注册中心,它只是将元数据、选择器数据、…

走近科学IT版:EasyTire设置了ip,但是一闪之后就变回到原来的dhcp获得的地址

EasyTier 是一款简单、安全、去中心化的内网穿透和异地组网工具,适合远程办公、异地访问、游戏加速等多种场景。无需公网 IP,无需复杂配置,轻松实现不同地点设备间的安全互联。 上次实践的记录:适合远程办公、异地访问的EasyTier…

rk3588平台USB 3.0 -OAK深度相机适配方法

目录 文件更改记录表 1、usb规则添加 2、拉取相关依赖 3、安装python3、安装pip 4、安装依赖 5、安装ffmeg 6、摄像头功能测试 7、将视频拷贝到U盘查看 1、usb规则添加 由于OAK是USB设备,因此为了在使用 udev 工具的系统上与之通信, 您需要添加udev规则以使…

工厂模式总结

工厂模式1. 简单工厂模式&#xff08;Simple Factory&#xff09; 核心思想 定义一个工厂类&#xff0c;根据输入参数创建不同的具体对象。客户端不直接调用具体类的构造函数&#xff0c;而是通过工厂类获取对象。 示例代码 #include <iostream> #include <memory>…

MySQL的三种安装方式(mis、zip、yum)

目录 2.0数据库安装 2.1windows上.mis格式 环境准备 MySQL的安装 环境配置&#xff08;非必要&#xff09; 2.2windows上.zip格式安装 环境准备 配置文件的内容 MySQL的安装 附录可能出现问题 图形工具远程连接数据库 2.3Linux上安装yum包 环境准备 过程命令 My…

串口学习和蓝牙通信HC05(第八天)

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-削好皮的Pineapple! &#x1f468;‍&#x1f4bb; hello 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 削好皮的Pineapple! 原创 &#x1f468;‍&#x1f4b…

设计总监的“轻量化”新武器:用Adobe Express,音频一键驱动动画

在快节奏的创意项目中&#xff0c;如何将复杂的设计理念或冗长的研究报告&#xff0c;快速转化为易于理解、富有吸引力的动态内容&#xff0c;是衡量一个团队沟通效率的关键。作为一名在海外设计界工作了十余年的设计师&#xff0c;我发现&#xff0c;最高效的团队&#xff0c;…

零知开源——STM32F407VET6驱动SHT41温湿度传感器完整教程

✔零知开源是一个真正属于国人自己的开源软硬件平台&#xff0c;在开发效率上超越了Arduino平台并且更加容易上手&#xff0c;大大降低了开发难度。零知开源在软件方面提供了完整的学习教程和丰富示例代码&#xff0c;让不懂程序的工程师也能非常轻而易举的搭建电路来创作产品&…

Linux流量分析:tcpdump wireshark

前言 最近因为工作需要&#xff0c;研究了下如何使用tcpdump和wireshark分析业务流量。如果要使用tcpdump分析具体的HTTP请求耗时&#xff0c;需捕获网络数据包并分析时间戳信息&#xff0c;重点关注TCP连接的建立、HTTP请求发送到响应接收的全过程。 以下是具体步骤和技巧&…

深度学习图像分类数据集—角膜溃疡识别分类

该数据集为图像分类数据集&#xff0c;适用于ResNet、VGG等卷积神经网络&#xff0c;SENet、CBAM等注意力机制相关算法&#xff0c;Vision Transformer等Transformer相关算法。 数据集信息介绍&#xff1a;角膜溃疡识别分类&#xff1a;[dot, mix, slice] 训练数据集总共有270张…

功能强、超好用【PDF转换工具】的介绍下载与安装教程

Windows 电脑上一款简单好用的PDF转换工具&#xff0c;可以轻松地将其他文档转换为 PDF 格式&#xff0c;也可以将 PDF 文件转换为其他格式&#xff0c;如常见的 Word、Excel、PPT 等。 此外软件还支持 Office 文档合并分割、旋转页面、拼接页面、删除文字、删除页面、添加水印…

c# 钉钉应用实现监听审批事件以及获取审批结果的流程

oa的操作已经测试了一遍 image.png如果是自建oa则代表发起的审批是跳转网页&#xff0c;否则钉钉打开后是一个表单界面&#xff0c;不需要调整自己搞得oa。 所以我感觉目前公司的需求更适合官方oa 表单来填写,更灵活&#xff0c;还支持用户配置。 但是用户点了审批&#xff0c;…