首页/新闻资讯/正文详情

Java 竞态条件(Race Condition)

发布时间:2026/11/11 4:52:03 来源:云帆数科 栏目:资讯中心
Java 竞态条件(Race Condition)
竞态条件Race Condition竞态问题多个线程同时访问共享可变资源最终结果依赖于线程调度、CPU 执行时序不同的执行顺序会得到不一样、不符合预期的结果。一句话核心正确结果要求一组操作不可分但多线程把这组操作打散交错执行了。⚠️ 竞态 ≠ 一定出错是概率性 bug复现极其不稳定是最难排查的一类线程安全问题。一、两个必备前提缺一不会产生竞态共享资源多个线程访问同一个变量 / 对象资源可变存在写操作只读不会竞态竞态本质分为两块竞态条件Race Condition逻辑时序问题操作交错内存可见性问题CPU 缓存、JVM 指令重排属于配套的线程安全问题经常和竞态一起出现二、经典例子count最常见竞态 Democount不是一条 CPU 指令它是三步复合操作1. 读取 count 当前值load 2. 值 1add 3. 写回 countstore这三步不具备原子性线程可以在任意一步被切换。代码示例public class RaceDemo { private static int count 0; public static void add() { count; } public static void main(String[] args) throws InterruptedException { Runnable task () - { for (int i 0; i 10000; i) { add(); } }; Thread t1 new Thread(task); Thread t2 new Thread(task); t1.start(); t2.start(); t1.join(); t2.join(); // 预期20000实际大概率小于20000 System.out.println(count); } }错误时序拆解重点初始 count 0 t1: load → 读到 0 【CPU切换t1暂停】 t2: load → 读到 0 t2: add → 1 t2: store → count1 【切回t1】 t1: add → 1 t1: store → count1两个线程都做了 1结果只 1丢失更新Lost Update这就是典型竞态。✅ 重点不是变量本身有问题是 **“读 - 改 - 写” 这一组操作没有原子保护**。三、竞态条件的分类3 大类1. 读 - 改 - 写 竞态上面 countLost Update最常见一组load → modify → save 只要中间被打断就丢更新。 类似i i - 1、自增自减、累加、扣余额。2. 先检查后执行Check-Then-Act检查然后执行先判断状态再基于判断结果做操作判断和操作之间线程被切换。经典场景懒加载单例DCL 不加 volatile 就踩这个坑、余额判断扣款、判空然后 new 对象。示例伪代码if (instance null) { // check instance new Singleton(); // act }时序t1 判断 instancenull线程切到 t2t2 也判断 instancenullt2 new 对象赋值切回 t1t1 继续 new创建两个实例 check 和 act 不是原子的中间窗口就是竞态窗口。3. 复合校验更新Read-Modify-Check先读计算再校验最后写入。业务里非常多库存扣减超卖、转账。// 伪代码超卖场景 if (stock 0) { stock stock - 1; }t1 读到 stock1还没扣减t2 也读到 stock1两个都扣减 → stock-1超卖。 电商超卖就是典型竞态问题。四、容易混淆的概念竞态条件 vs 数据竞争Data Race很多人把两者混在一起JMM 规范里是分开定义数据竞争 Data Race两个线程无同步地访问同一个共享变量至少一个是写。 数据竞争是语法层面现象。竞态条件 Race Condition因为执行时序交错导致业务逻辑结果错误。关系数据竞争 是竞态条件的常见诱因但有数据竞争不一定结果错有竞态也不一定来自数据竞争。 比如某些时序交错刚好每次结果都对属于 “隐藏竞态偶然不出错”。五、JMM 带来的叠加问题指令重排、可见性竞态除了线程切换交错还会被 JMM 放大可见性线程把变量读到 CPU 高速缓存修改后没及时刷入主存别的线程看不到最新值volatile解决可见性、禁止重排但不能保证原子性volatile int count解决不了 count 竞态指令重排序JIT、CPU 为了性能打乱代码执行顺序DCL 单例就是因为对象 new 分为分配内存、初始化、引用赋值三步重排会出现引用不为 null 但对象还没初始化完成。重要坑volatile 能防重排和可见性不能解决 RMW 读改写的原子竞态。六、Java 里解决竞态的方案按分类方案 1synchronized 同步锁互斥锁最通用保证临界区代码原子执行同一时间只有一个线程进入临界区。private static int count 0; // 锁住方法临界区count public synchronized static void add() { count; }原理monitor 锁进入加锁、退出解锁临界区内操作不会被其他线程干扰。 优点简单缺点排他阻塞竞争激烈时性能差。方案 2Lock 显式锁ReentrantLock和 synchronized 语义一致功能更强可中断、公平锁、尝试锁、多条件变量。private static final ReentrantLock lock new ReentrantLock(); private static int count 0; public static void add() { lock.lock(); try { count; } finally { lock.unlock(); } }方案 3CAS 无锁乐观锁Atomic 系列适合读多写少场景java.util.concurrent.atomicAtomicInteger、AtomicLong底层 CPU 硬件指令cmpxchg硬件层面原子的读改写没有阻塞。private static AtomicInteger count new AtomicInteger(0); public static void add() { count.incrementAndGet(); // 原子自增不会竞态 }CAS 缺点自旋消耗 CPU、ABA 问题、不能一次性保护多个变量。方案 4线程封闭避开共享根治竞态不共享可变变量自然不存在竞态局部变量栈封闭每个线程栈独立ThreadLocal每个线程独有副本不共享方案 5不可变对象Immutable共享对象一旦创建永远不改只有读没有写天然线程安全String、BigInteger、自己写的 final 字段类。没有写操作直接消除竞态前提。方案 6并发容器 / 原子复合引用多变量需要一起原子更新AtomicReference、AtomicStampedReference或者使用ConcurrentHashMap等并发集合注意并发容器只能保证单个方法线程安全多个方法组合操作依然会竞态// ❌ 即使是ConcurrentHashMap下面这两行组合依然竞态 if (map.containsKey(key)) { map.put(key, val); }containsKey和put两个独立原子操作中间有空隙属于 Check-Then-Act 竞态这个是高频面试坑。七、竞态的特征排错识别要点偶现 bug压力大、CPU 忙才容易复现本地跑一万次没问题生产偶尔翻车日志很难定位日志打印本身有同步加日志之后竞态可能消失Heisenbug 海森堡 bug问题和并发调度强相关和业务代码语法无关修复思路找到【共享可变变量】找到【非原子复合操作】加同步 / 原子封装八、面试高频总结口诀竞态共享可变 非原子操作时序交错结果不定count load-modify-store三步无原子典型 Lost UpdateCheck-Then-Act先判断后执行中间空隙是竞态窗口volatile 解决可见、重排不解决 RMW 原子竞态ConcurrentHashMap 单个方法安全多方法组合依然竞态解决手段synchronized、Lock、AtomicCAS、线程封闭、不可变九、拓展怎么定位线上竞态问题看现象数值不对、超卖、重复创建、状态错乱压力越高概率越高审查代码找共享成员变量检查有没有 “读→计算→写”、“if 判断然后修改”工具Jcstress专门测试竞态并发正确性OpenJDK 官方工具、junit 并发压测、JProfiler 看锁竞争

相关推荐

近年来,随着大语言模型(LLM)的突破,生成式推荐(Generative Recommendation)成为研究热点
近年来,随着大语言模型(LLM)的突破,生成式推荐(Generative Recommendation)成为研究热点

2026 年 10 月 24 日至 25 日,以“具身同行,智构未来”为主题的 2026 长沙 1024 程序员日暨 AI 构建者大会在湖南湘江新区世界计算长沙智谷举行。大会汇聚了来自全国的企业代表、开发者、高校团队与行业专家,围绕具身智能、AI 生产力变革、智… · 2026/11/6 9:27:09

HarnessDev 分析
HarnessDev 分析

论文:HarnessDev: Can LLMs Create and Evolve Their Own Agent Harness? 2026年9月,来自字节跳动种子基金 (ByteDance Seed)、新加坡科技设计大学、佐治亚理工学院,M-A-P和TokenWave.AI。 HarnessDev 是一个 benchmark(评测框… · 2026/11/8 14:16:27

前端开发者的“黄金时代“已来临:掌握AI Agent开发,价值翻倍!
前端开发者的“黄金时代“已来临:掌握AI Agent开发,价值翻倍!

AI编程工具的快速发展引发了"前端已死"的焦虑,但AI Agent的爆发反而为前端开发者创造了巨大机遇。前端的核心技能——异步流程设计、流式体验优化、交互状态管理等——恰好是Agent应用开发的关键。主流AI厂商的Agent SDK优先支持TypeScript/Node.js&#… · 2026/11/5 21:41:27

复审电工证要单位出钱有效期多久
复审电工证要单位出钱有效期多久

电工证复审要单位出钱值不值得考?南阳企业主亲身经历揭秘 我刚从工地回来,手里还拿着一沓证书复印件,说实话,心里挺焦虑的。眼下正是招工旺季,但新来的几个小伙子都因为 电工证复审过期 被拒之门外, 急需特种作业证才能上岗找工作… · 2026/11/11 4:51:32

低压电工作业触摸屏考试真题与备考技巧,全国通用证书怎么复审你知道吗
低压电工作业触摸屏考试真题与备考技巧,全国通用证书怎么复审你知道吗

低压电工作业触摸屏考试真题与备考技巧,全国通用证书怎么复审你知道吗 证书过期了不知道怎么复审延期,这事儿别慌,但得赶紧上心。特别是低压电工作业触摸屏考试的证书,全国通用,但有效期只有三年,三年过后不及时复审,证书就作废了,再想上岗就得重新报… · 2026/11/11 4:51:32

高压电工证快速办理6怎么转异地 高压电工证快速办理6官方报名入口在哪里
高压电工证快速办理6怎么转异地 高压电工证快速办理6官方报名入口在哪里

高压电工证快速办理6怎么转异地 高压电工证快速办理6官方报名入口在哪里 你缺一张高压电工证,缺得火烧眉毛,偏偏报名流程复杂,信息真假难辨,连官方报名入口都找不到,这不是找工作路上的拦路虎吗?别急,今天我们就来聊聊高压电工证快速办理6的相关问… · 2026/11/11 4:51:32

天津西青哪有办电工证 良心建议给学历不高但想考证的你
天津西青哪有办电工证 良心建议给学历不高但想考证的你

天津西青哪有办电工证 良心建议给学历不高但想考证的你 你是不是也和我一样,学历不高,怕报不上名?其实,特种作业操作证的报考并不看学历高低,只看你有没有相关工作经验,或者有没有经过正规培训。特别是 天津西青哪有办电工证… · 2026/11/11 4:51:32

刚拿到电工证去面试在哪考能避开坑
刚拿到电工证去面试在哪考能避开坑

刚拿到电工证去面试在哪考能避开坑 怕考不过白交培训费?刚拿到电工证去面试在哪考才能不踩雷?现在找工作,特种作业操作证成了敲门砖,尤其是电工证,几乎是建筑、水电、安装等行业标配。但很多刚拿到证的朋友都担心, 电工证是不是全国通用 ? 在哪考… · 2026/11/11 4:51:32

贺东东电工证考前押题怎么准备?工地太忙根本没时间复习考试
贺东东电工证考前押题怎么准备?工地太忙根本没时间复习考试

贺东东电工证考前押题怎么准备?工地太忙根本没时间复习考试 工地太忙根本没时间复习考试,这是很多劳务班组负责人的共同痛点。尤其像贺东东电工证这种特种作业操作证,不仅关系到个人职业发展,也直接决定了能否顺利承接工程项目。但现实中,很多人都因为工… · 2026/11/11 4:50:32

电工证丢失还能补吗?千万别踩坑,丢了证等于失业
电工证丢失还能补吗?千万别踩坑,丢了证等于失业

电工证丢失还能补吗?千万别踩坑,丢了证等于失业 你正在找工作,但手里的电工证突然丢了,这下怎么办?别急,先别慌, 电工证丢失还能补吗 ?答案是肯定的,但 千万别踩坑 ,补办流程如果不了解,可能会耽误你上岗、甚至影响到你的收入。… · 2026/11/10 2:16:10

电力电缆作业证直播报名入口与办理流程良心建议
电力电缆作业证直播报名入口与办理流程良心建议

电力电缆作业证直播报名入口与办理流程良心建议 你是不是也担心学历不高报不了名?别急,今天就给你讲讲 电力电缆作业证直播 的报名流程和那些你必须知道的干货, 良心建议 在这里,别错过。 电力电缆作业证直播报名需要什么条件?… · 2026/11/10 17:46:39

英德电工证报考费多少钱,怕考不过白交培训费?看完这篇别再踩坑
英德电工证报考费多少钱,怕考不过白交培训费?看完这篇别再踩坑

英德电工证报考费多少钱,怕考不过白交培训费?看完这篇别再踩坑 怕考不过白交培训费?英德电工证报考费多少钱,你真的了解吗?现在市面上培训机构五花八门,价格参差不齐,很多人一不小心就花了冤枉钱,结果还考不过。别急,今天就来给你说清楚英德电工证的… · 2026/11/10 17:11:43

_中职电工证最新政策解读
_中职电工证最新政策解读

中职电工证在哪考?工地太忙根本没时间复习考试的救星来了 工地太忙根本没时间复习考试,这是很多正在备考 中职电工证 的建筑工友的真实写照。你不是不想考,而是真的没时间。但别担心,这期内容是 新乡初次报考人员… · 2026/11/11 0:00:52

昆明电工证培训价格值不值得考?老电工告诉你真相
昆明电工证培训价格值不值得考?老电工告诉你真相

昆明电工证培训价格值不值得考?老电工告诉你真相 之前考的证在外省能不能转过来?这个问题是很多在外地打工、换城市生活、或者是想在昆明发展的朋友最关心的。尤其是现在云南发展快,很多企业都在招持证上岗的电工,如果你手头有证但不在本地,那这个证是不… · 2026/11/11 0:00:52

特种电缆张工网上查询全攻略:外省证如何转过来
特种电缆张工网上查询全攻略:外省证如何转过来

特种电缆张工网上查询全攻略:外省证如何转过来 之前考的证在外省能不能转过来?这是很多特种作业从业者最关心的问题,尤其是像特种电缆张工这类证书,直接关系到日常工作是否合规、能否顺利晋升。很多小伙伴因为证书归属地的问题,陷入职业发展的瓶颈,甚至… · 2026/11/11 0:00:52

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/10 20:19:29

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/10 19:22:45

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/10 17:00:47

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码