当前位置: 首页 > news >正文

什么是 Java 中的原子性、可见性和有序性?

Java 中的原子性、可见性、有序性是多线程编程中最核心的三个特性,也称为“并发三要素”或“happens-before 关系的三大保证”。

它们直接决定了代码在多线程环境下是否能得到“预期”的执行结果。下面用最直白的方式解释三者的含义、为什么会丢失、以及 Java 是如何(或没能)保证它们的。

1. 原子性(Atomicity)

定义
一个操作(或一组操作)要么全部执行成功,要么全部不执行,不会出现“执行到一半”的中间状态。

最经典的非原子例子(很多人踩过的坑):

intcount=0;// 线程 A 线程 Bcount++;count++;

上面看似一行代码,实际 JVM 会分解为:

  1. 读取 count 的值
  2. +1
  3. 把新值写回 count

所以真正的执行序列可能是:

线程A 读 0 线程B 读 0 线程A +1 → 1 线程A 写回 1 线程B +1 → 1 线程B 写回 1

最终 count = 1,而不是预期的 2 →丢失更新(非原子)

Java 中真正具有原子性的操作(部分):

操作类型是否原子说明
基本类型(除 long/double 外)的读写32位以内基本类型读写是原子的
long / double 的读写不是(JDK8 前)64位拆成两个 32 位,可能看到“半写”
volatile long / double是(JDK5+)volatile 保证 long/double 读写原子
使用 AtomicXXX 类AtomicInteger、AtomicLong 等
synchronized / Lock可以做到保护的代码块整体原子

小结
普通 int 的count++不是原子操作
想保证原子性 → 用AtomicIntegersynchronizedReentrantLockLongAdder


2. 可见性(Visibility)

定义
当一个线程修改了共享变量的值,其他线程立刻能看到最新的值。

经典反例(最常出现的可见性问题):

booleanrunning=true;voidstop(){running=false;// 线程A执行}voidrun(){while(running){// 线程B一直循环// do something}}

很多时候线程B永远停不下来,因为它读到的running一直是自己工作内存里的旧值(true),没有从主内存刷新最新值(false)。

原因
Java 内存模型(JMM)允许线程把变量先写到本地工作内存(CPU 缓存),而不是立刻写回主内存。
其他线程可能长时间从自己的缓存读旧值。

Java 提供可见性保证的方式

方式是否提供可见性额外效果典型使用场景
volatile禁止指令重排序状态标志、单次发布
synchronized进入/退出同步块刷新保护共享变量的复合操作
Lock(ReentrantLock)同 synchronized需要可中断、超时、公平锁场景
final是(初始化后)禁止重排序不可变对象、安全发布
AtomicXXXCAS + volatile 语义原子操作 + 可见性

记住一句话
只要变量被 volatile 修饰、或者在 synchronized 块内读写、或者通过 Atomic 类操作,就有了可见性保证。


3. 有序性(Ordering)

定义
代码的执行顺序不一定等于程序代码的书写顺序(只要不影响单线程结果,编译器/JVM/CPU 都可以重排序)。

经典反例(双重检查锁单例的陷阱):

classSingleton{privatestaticSingletoninstance;// 非 volatilepublicstaticSingletongetInstance(){if(instance==null){// 第一次检查synchronized(Singleton.class){if(instance==null){// 第二次检查instance=newSingleton();// 问题在这里!}}}returninstance;}}

new Singleton()不是一个原子操作,它有三个步骤:

  1. 分配内存
  2. 初始化对象(调用构造方法)
  3. 把引用指向这块内存(instance 指向新对象)

指令重排序后可能出现

线程 A:1→3→2(先把引用指向内存,再初始化)
线程 B:看到 instance != null,直接返回 → 拿到半初始化对象 → 使用时崩溃或逻辑错误

解决方案(三种主流写法):

// 写法1:volatile(最常用、最清晰)privatestaticvolatileSingletoninstance;// 写法2:静态内部类(推荐,无 volatile 也安全)privatestaticclassHolder{privatestaticfinalSingletonINSTANCE=newSingleton();}publicstaticSingletongetInstance(){returnHolder.INSTANCE;}// 写法3:枚举(最安全、最简洁)publicenumSingleton{INSTANCE;// 其他方法...}

Java 提供有序性保证的方式

方式禁止的重排序类型典型使用场景
volatile写→读、写→写DCL 单例、状态标志
synchronized进入/退出同步块前后任何需要同步的代码块
finalfinal 字段初始化 → 后续读不可变对象、安全发布
Happens-before 规则多种情况(详见 JMM 8 条规则)理解并发语义的核心

快速记忆对比表(面试/实战最常用)

特性关注点丢失的表现常见解决方案典型工具/关键字
原子性操作不可分割读-改-写中间被打断synchronized / Lock / AtomicXXXAtomicInteger、LongAdder
可见性写后其他线程能看到一个线程改了值,另一个线程看不到volatile / synchronized / final / Lockvolatile
有序性代码不按书写顺序执行new 对象引用先发布,构造未完成volatile / final / synchronizedvolatile + DCL、静态内部类

一句话总结(最常考的表述):

Java 并发编程的三大核心问题:

  • 原子性:操作要“要么全做,要么不做”
  • 可见性:修改要“让别人看得到”
  • 有序性:不要“看起来合理的重排序”把程序搞乱

如果你想继续深入某个点(比如 happens-before 规则完整列表、volatile 底层内存屏障、JMM 模型图解、LongAdder 原理等),可以直接告诉我,我再给你展开更详细的例子和代码。

http://www.jsqmd.com/news/294384/

相关文章:

  • 2000亿美元!2026年全球游戏行业的新格局与新变量
  • 使用 wxPython 构建文件编辑器与预览器:从零到一的完整实现
  • 从零构建轻量级企业考勤订饭系统:Node.js + SQLite 全栈实战复盘
  • python如何发送邮件
  • 【课程设计/毕业设计】基于Springboot的在线游戏商城系统基于springboot的游戏售卖商城系统【附源码、数据库、万字文档】
  • Python如何识别周围WiFi:跨平台实现与进阶技巧
  • 一键生成100条小红书笔记!DeepSeek+火兔工具箱的组合太牛了!
  • 【毕业设计】基于springboot的助农扶贫系统(源码+文档+远程调试,全bao定制等)
  • 白盒测试 接口测试 自动化测试
  • 2026年上海企业管理咨询公司权威推荐:卓越绩效模式/ 绩效模式 /绩效分析模式/ 团队绩效模式/高绩效心理建设源头服务商精选
  • 雅思网上辅导终极榜单推荐|2026 雅思网上辅导实测 全国适配机构汇总
  • Router_T000_ConceptMECE
  • 离散化详解
  • 山东一卡通(礼遇卡)哪里回收方便,1分钟变现技巧
  • Java毕设选题推荐:基于springboot的游戏售卖商城系统基于SpringBoot+Vue的游戏装备交易商城系统【附源码、mysql、文档、调试+代码讲解+全bao等】
  • 计算机Java毕设实战-基于springboot的游戏售卖商城系统游戏攻略资讯补丁售卖系统 游戏道具商城【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • Java计算机毕设之基于springboot+vue的游戏装备账号销售商城平台系统基于springboot的游戏售卖商城系统(完整前后端代码+说明文档+LW,调试定制等)
  • Java毕设项目:基于springboot的助农扶贫系统(源码+文档,讲解、调试运行,定制等)
  • 2026英语雅思口语培训辅导机构排行榜 家长择校实用指南:多维度评测帮孩子选对适配口语辅导机构
  • 2026英语雅思培训学校机构辅导机构推荐榜单 家长择校指南:多维度评测帮孩子选对适配机构
  • 全国支付宝立减金回收平台正规使用攻略
  • 2026英语雅思培训学校机构辅导机构排行榜+核心解析 家长择校实用指南 帮孩子精准匹配雅思备考全阶段适配方案
  • 01BFS
  • 2026英语雅思口语培训辅导机构排行榜+核心解析 家长择校实用指南 精准匹配孩子口语备考需求
  • 2026 雅思备考必看|网上辅导 TOP5 权威口碑排行榜测评 高效提分推荐
  • 2026英语雅思培训学校机构辅导机构排行榜+核心解析 家长择校完全指南 帮孩子精准匹配适配的雅思备考方案避误区
  • 现在的00后,真是卷死了呀,想离职了·····
  • 加载权重文件后发现准确率有问题
  • 2026英语雅思培训学校机构辅导机构排行榜 家长择校完全指南:多维度评测帮孩子选对适配辅导机构
  • 2026英语雅思学习辅导机构推荐榜单 家长择校完全指南:多维度评测解析帮孩子选对适配机构