首页 游戏 软件 资讯 排行榜 专题
首页
编程语言
如何在 Java 中使用 AtomicInteger 实现无锁的线程安全计数

如何在 Java 中使用 AtomicInteger 实现无锁的线程安全计数

热心网友
15
转载
2026-04-30

如何在 Ja va 中使用 AtomicInteger 实现无锁的线程安全计数

如何在 Ja va 中使用 AtomicInteger 实现无锁的线程安全计数

先来看一个核心的技术论断:AtomicIntegerincrementAndGet通常比synchronized快,因为它基于CPU的CAS指令,避免了阻塞和上下文切换的开销。但事情总有另一面:在高争用场景下,它可能因频繁重试反而效率更低,并且它只适用于简单的原子操作。

AtomicInteger 的 incrementAndGet 为什么比 synchronized 快

关键在于底层机制。incrementAndGet直接调用了CPU的CAS(比较并交换)指令,这是一种非阻塞的乐观策略。线程不会进入阻塞队列,自然也就绕开了上下文切换和锁竞争带来的性能损耗。相比之下,synchronized在高并发压力下,可能会经历偏向锁、轻量级锁到重量级锁的升级过程。一旦膨胀为系统级的互斥锁,性能就会出现断崖式下跌。

不过,这里必须划个重点:CAS并非万能钥匙。在极端的高争用场景下——想象一下上千个线程反复争夺同一个AtomicInteger——CAS操作失败和重试的次数会急剧增加,CPU消耗可能不降反升,这时候它的表现甚至可能不如一把简单的锁。

  • 适用场景:计数器、序列号生成、统计指标(如请求量、错误数)这类典型的“读多写少”或“写操作本身很简单”的场景。
  • 不适用场景:需要原子性地执行多个变量联动更新的复杂操作(例如“从余额减100的同时记录一条流水”)。这种时候,就该考虑Lock或事务机制了。
  • 一个小提醒incrementAndGet()返回的是增加后的新值,而getAndIncrement()返回的是增加前的旧值。在条件判断等逻辑中,可别用反了。

compareAndSet 是唯一能做条件更新的原子操作

如果想实现“仅当当前值为某个特定值时才进行更新”,那么compareAndSet是唯一正确的选择。千万别试图先get()set()——这两个操作之间的间隙就是一个竞态窗口,根本不是原子的。

来看一个典型的错误写法:

int cur = counter.get();
if (cur == 5) {
    counter.set(6); // ❌ 危险!执行get()后,cur的值可能已经被其他线程修改了
}

正确的做法应该是这样:

int expected = 5;
boolean updated = counter.compareAndSet(expected, expected + 1);
// updated为true表示更新成功;为false则表示在此期间值已被改动,需要决定重试或放弃
  • compareAndSet是典型的乐观锁策略:假设冲突很少发生,失败了就重试。它适合低到中等争用的场景。
  • 如果业务逻辑本身就很复杂,或者重试的代价很高,那么硬套CAS可能得不偿失,不如直接使用ReentrantLock
  • 注意参数顺序:compareAndSet(expectedValue, newValue),千万别把期望值和新值的位置写反了。

AtomicInteger 不能替代 long 类型的原子运算

这是一个容易踩坑的地方。AtomicInteger包装的是int类型(32位),其最大值是Integer.MAX_VALUE(2147483647)。一旦计数超过这个值,incrementAndGet()不会抛出异常,而是会发生静默的整数溢出,从最大值翻转到最小值(-2147483648)。

如果你的计数器有超过21亿的可能(比如全局日志行数、海量消息处理量),就必须换用其他方案:

  • AtomicLong:支持64位长整型,上限约9×10¹⁸,足以应对绝大多数场景。
  • LongAdder:在超高并发的累加场景下,它的性能通常比AtomicLong更优。其内部采用了分段累加的策略来减少CAS争用。但需要注意的是,它不支持compareAndSet操作。
  • 切记,不要自己用synchronized包裹一个long变量来模拟原子性,这等于放弃了无锁编程的全部优势。

get() 和 lazySet() 的内存语义差异常被忽略

get()是一个volatile读,它能保证线程总是能读到最新的值。而lazySet()(可以看作是set()的一个弱化版本)只保证写入操作本身不会被指令重排序,但并不保证这个新值能立即被后续的读操作看到——JVM可能会延迟将其刷新回主内存。

这意味着:

  • 在写密集、且读写操作没有紧密耦合的场景下(例如信号量清零、设置一个状态标记),用lazySet(value)替代set(value)可以略微提升写性能。
  • 但是,它绝对不能用在对写后立刻读有强依赖的逻辑中。例如:counter.lazySet(0); assert counter.get() == 0; 这个断言是有可能失败的。
  • 对于大多数业务代码而言,lazySet可能根本用不上。除非你在明确的性能压测中发现set()成为了瓶颈,并且能够接受最终一致性的语义。

说到底,无锁编程并非没有成本,它只是将同步的成本从线程的阻塞和切换,转移到了CPU的重试循环和内存屏障上。因此,最关键的一步,是清醒地评估你的计数场景是否真的需要无锁方案。很多号称“高并发”的系统,其核心计数器的更新频率可能每秒只有几百次,在这种量级下,使用synchronized不仅完全够用,而且代码更直观,更不容易出错。

来源:https://www.php.cn/faq/2393324.html
免责声明: 游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

相关攻略

AI原生IDE对决Cursor与IDEA Java程序员选择指南
AI资讯
AI原生IDE对决Cursor与IDEA Java程序员选择指南

Cursor vs IDEA:AI原生IDE的碘伏之战,Ja va程序员该如何选择? 2026年,AI编程工具的战场硝烟弥漫。Cursor凭借其AI原生的设计理念横空出世,而传统巨头JetBrains也宣布与Cursor达成深度集成(ACP协议)。面对这场变革,Ja va开发者是应该拥抱新锐的Cur

热心网友
05.19
Java与LangChain4j实现RAG文档智能拆分提升检索质量
AI资讯
Java与LangChain4j实现RAG文档智能拆分提升检索质量

在AI驱动的RAG系统开发与后端面试中,文档切分策略是衡量工程深度的关键指标。简单回答“按固定字符数截取”往往暴露了项目经验的不足。业务场景中RAG的召回效果,数据预处理的质量占据了决定性因素。切片(Chunking)策略的优劣,直接为整个系统的召回能力设定了天花板。后续无论采用多么先进的大模型或精

热心网友
05.18
Win10系统安装Java环境详细步骤与JDK配置指南
系统平台
Win10系统安装Java环境详细步骤与JDK配置指南

必须安装JDK并配置JA VA_HOME与Path环境变量;先下载JDK 17 21 LTS版本,安装时取消“Add to PATH”,再手动设置JA VA_HOME指向安装目录,并在Path中添加%JA VA_HOME% bin,最后用ja va -version等命令验证。 在Windows 1

热心网友
05.17
Win11安装Java环境详细教程:配置JDK与运行环境
系统平台
Win11安装Java环境详细教程:配置JDK与运行环境

彻底解决“ja va不是内部或外部命令”问题,关键在于正确安装JDK并精准配置JA VA_HOME与Path环境变量。本文提供两种主流方案:推荐使用MSI安装包配合手动配置,或选择ZIP解压版进行全手动设置。同时涵盖多版本JDK管理技巧,并明确说明现代开发无需配置CLASSPATH。最后通过版本检查

热心网友
05.16
Java线程中断机制源码详解 如何优雅停止线程避免死锁
业界动态
Java线程中断机制源码详解 如何优雅停止线程避免死锁

在深入探讨了ScheduledThreadPoolExecutor的定时任务执行机制后,我们已经掌握了多线程任务的“启动”与“运行”环节。然而,一个健壮的并发系统,其“终止”环节同样至关重要。许多开发者专注于如何高效启动线程,却对如何让其安全、优雅地停止感到困惑。不当的线程终止方式,如粗暴中断或错误

热心网友
05.16

最新APP

宝宝过生日
宝宝过生日
应用辅助 04-07
台球世界
台球世界
体育竞技 04-07
解绳子
解绳子
休闲益智 04-07
骑兵冲突
骑兵冲突
棋牌策略 04-07
三国真龙传
三国真龙传
角色扮演 04-07

热门推荐

AI Agent能力进化平台 水产市场实用技能全解析
AI资讯
AI Agent能力进化平台 水产市场实用技能全解析

水产市场是什么 在AI Agent的生态中,能力共享与协同进化是核心驱动力。水产市场(Seafood Market)正是为OpenClaw框架量身打造的AI Agent能力共享平台。你可以将其理解为AI领域的“应用商店”或“技能交易中心”,旨在实现AI能力的快速流通与组合创新。 目前,平台已集成超过

热心网友
05.24
MeowTXT AI音视频转文字工具 智能识别说话人
AI资讯
MeowTXT AI音视频转文字工具 智能识别说话人

在信息爆炸的时代,高效地将音视频内容转化为可编辑、可检索的文字,已经成为内容创作者、研究者和职场人士的刚需。今天要聊的这款工具——MeowTXT,正是瞄准了这一痛点,它不仅仅是一个简单的转录工具,更是一个集成了智能识别、摘要和翻译的AI生产力平台。 MeowTXT是什么 简单来说,MeowTXT是一

热心网友
05.24
开源AI Agent操作系统OpenFang自动执行完整工作流
AI资讯
开源AI Agent操作系统OpenFang自动执行完整工作流

OpenFang是什么 在AI Agent领域,我们常常面临一个困境:大多数系统仍然停留在“你说一句,它动一下”的被动模式,离真正的自动化还有距离。今天要聊的OpenFang,正是在尝试打破这个局面。它是一个用Rust语言构建的开源Agent操作系统,其核心创新在于引入了“Hands”的概念——你可

热心网友
05.24
腾讯混元开源全模态大模型压缩工具包AngelSlim详解
AI资讯
腾讯混元开源全模态大模型压缩工具包AngelSlim详解

AngelSlim是什么 随着大模型参数规模不断增长,如何实现高效推理与低成本部署已成为开发者面临的核心挑战。腾讯混元团队推出的开源工具包AngelSlim,正是为解决这一难题而生。它是一个面向全模态大模型的综合压缩与加速解决方案,集成了量化、投机采样、稀疏化及知识蒸馏等前沿技术,旨在为各类大语言模

热心网友
05.24
AI音视频转录工具Transcript LOL 智能区分说话人
AI资讯
AI音视频转录工具Transcript LOL 智能区分说话人

在信息过载的数字化时代,音频与视频内容已成为知识传递、创意表达与商业沟通的核心载体。然而,如何将这些宝贵的非结构化媒体资产,高效、精准地转化为可搜索、可分析、可编辑的文本格式,始终是内容创作者、市场研究人员、学者及商务人士的核心痛点。一款强大的AI转录工具,正是打通音视频内容价值闭环、释放生产力潜能

热心网友
05.24