指令重排序
一、为什么会发生指令重排序CPU、编译器不会严格按照你写代码的顺序一行一行执行有些指令阻塞等待读写内存、IOCPU 闲着编译器 / CPU 调整指令顺序把能并行执行的指令提前跑充分利用硬件资源提升吞吐。前提单线程下重排不能改变最终执行结果这是重排序遵守的基础规则as-if-serial 语义。举个简单例子int a 1; int b 2; int c a b;编译器可以重排成int b 2; int a 1; int c a b;单线程结果完全一样无任何影响所以允许重排。二、三种重排序来源1. 编译器优化重排序JIT 编译器JIT 在编译字节码为机器码时调整语句执行顺序消除冗余、优化分支、合并读写。2. CPU 指令重排处理器乱序执行CPU 有多级流水线、多个运算单元。 一条指令读内存很慢CPU 不会干等会先执行后面不依赖它数据的指令也就是乱序执行。3. 内存系统重排序缓存、写缓冲区每个 CPU 核心有独立高速缓存、写缓冲写操作不会立刻刷入主存写入缓冲延时刷新宏观上看起来读写顺序颠倒。三、核心规则as-if-serial 语义不管怎么重排序单线程程序的执行结果不能改变。 有数据依赖的两行代码绝对不能重排写后读a1; ba;不能颠倒读后写ba; a2;不能颠倒写后写a1; a2;不能颠倒。无数据依赖的代码才允许随意调换顺序。四、重排序带来的多线程安全问题重点考点as-if-serial 只保证单线程正确多线程之间没有这个约束会出现逻辑错乱最经典例子DCL 双重检查锁单例。instance new Singleton();这一行代码底层拆成三步分配一块内存空间在内存中初始化 Singleton 对象构造函数赋值将 instance 引用指向这块内存地址。这三步不存在数据依赖编译器 / CPU 可以重排顺序为1 → 3 → 2。多线程故障场景线程 A 执行 instancenew Singleton ()重排执行 1 分配内存、3 赋值引用还没执行初始化 2此时线程 B 进入判断if(instance null)发现 instance 不为空线程 B 直接使用 instance拿到一个未初始化完成的半空对象出现空指针 / 数据错乱。这就是指令重排序导致的并发 bug解决方案用volatile修饰 instance插入内存屏障禁止这三步重排。五、volatile 如何禁止指令重排序内存屏障 Memory Barriervolatile 会在读写前后插入对应屏障限制指令上下穿越屏障重排volatile 写操作StoreStore 屏障 StoreLoad 屏障 所有 volatile 写前面的读写不能重排到 volatile 写之后 volatile 写不能和后面的 volatile 读重排。volatile 读操作LoadLoad 屏障 LoadStore 屏障 volatile 读后面的读写不能重排到 volatile 读之前。简单记 写 volatile前面代码不许后移 读 volatile后面代码不许前移 彻底阻断跨 volatile 变量的指令乱序。六、补充synchronized 也能防止重排同步块整体具备原子性、有序性同步代码内部的指令不会跑到锁外面锁外代码也不会进入锁内天然屏蔽跨同步区的重排序。七、精简总结口述版指令重排序是 JIT 编译器、CPU、缓存系统为优化性能打乱代码执行顺序单线程遵循 as-if-serial 语义结果不变但多线程无保护时会出现逻辑错乱典型场景是 DCL 单例拿到未初始化对象volatile 通过插入内存屏障禁止跨 volatile 变量的重排序保证多线程下执行顺序符合代码书写逻辑。

相关新闻

别踩误区:2026年录音总结APP怎么选,亲测整理了实用推荐经验

别踩误区:2026年录音总结APP怎么选,亲测整理了实用推荐经验

先按场景给答案 2026年选录音总结APP不存在万能通用款,核心是匹配你自己的使用场景,而非找所谓的“第一名”。本文是我作为长期测试AI效率工具的博主,亲测了当前主流的5款工具后整理的分场景推荐,所有体验都来自实际使用&#xf…

2026/7/15 20:27:00 阅读更多 →
SPI-----通信协议详解(二):时序模式与多设备管理实战

SPI-----通信协议详解(二):时序模式与多设备管理实战

1. SPI通信协议基础回顾SPI(Serial Peripheral Interface)是一种高速全双工的同步串行通信协议,由摩托罗拉公司在1980年代提出。它通过四根线实现主从设备之间的数据交换:SCLK(时钟线)、MOSI(主…

2026/7/15 20:22:59 阅读更多 →
阿里云云监控 CMS 2.0 推 Session Replay 与热力图:穿透前端迷雾,优化用户体验

阿里云云监控 CMS 2.0 推 Session Replay 与热力图:穿透前端迷雾,优化用户体验

阿里云云监控 CMS 2.0 推 Session Replay 与热力图:穿透前端迷雾,实现用户体验优化闭环随着前端体验优化需求的精细化,开发者面临的挑战已从"发现报错"转向"理解用户行为"。传统的指标监控在应对页面卡顿却无日志、转化率…

2026/7/15 20:20:59 阅读更多 →

最新新闻

【Linux 系统编程】进程概念全景:从 PCB、/proc 到进程状态与虚拟地址空间

【Linux 系统编程】进程概念全景:从 PCB、/proc 到进程状态与虚拟地址空间

文章从“操作系统如何管理进程”出发,通过可复现的命令和 C 语言实验,梳理 PCB、PID/PPID、/proc、cwd/exe、chdir、fork、进程状态、僵尸进程、环境变量以及虚拟地址空间。一、主线:操作系统为什么需要“进程” 我们平时说“运行一个程序”&…

2026/7/15 21:23:23 阅读更多 →
DLP670S DMD芯片深度解析:从微镜原理到高速光场调制系统集成

DLP670S DMD芯片深度解析:从微镜原理到高速光场调制系统集成

1. 从微镜到光场:DLP670S DMD芯片深度解析如果你正在设计一套高精度3D扫描仪、一台工业级光固化3D打印机,或者一个需要高速、高分辨率空间光调制的系统,那么你大概率绕不开一个核心器件——数字微镜器件,也就是我们常说的DMD。它不…

2026/7/15 21:19:20 阅读更多 →
HEAD请求实战指南:从原理到性能优化的深度探索

HEAD请求实战指南:从原理到性能优化的深度探索

1. HEAD请求的本质与核心价值第一次听说HEAD请求时,你可能会有这样的疑问:既然已经有了GET请求,为什么还需要一个不返回响应体的请求方法?这就像去餐厅吃饭时,服务员先给你看菜单(HEAD请求)&…

2026/7/15 21:15:18 阅读更多 →
python 连接拓竹打印机

python 连接拓竹打印机

目录 怎么查看序列号: 连接代码:conn_tool.py 怎么查看序列号: 机器屏幕中:设置,设备和序列号,序列号,里面有序列号 连接代码: conn_tool.py 可以获取打印进度。 import time import bambulabs_api as blclass BambuPrinter:def __init__(self, ip, access_code, se…

2026/7/15 21:15:18 阅读更多 →
Claude Code:AI编程新范式

Claude Code:AI编程新范式

Claude Code:AI编程助手的革命性工具,从入门到精通 Claude Code 作为一款基于 Claude 模型的终端智能编码助手,正以其强大的代码理解、生成和优化能力,重塑开发者的工作流。它不仅支持自然语言指令,还能深度集成到开发…

2026/7/15 21:13:17 阅读更多 →
各平台数字人实测:免费数字人平台哪款值得用?真人克隆和商用出片怎么选

各平台数字人实测:免费数字人平台哪款值得用?真人克隆和商用出片怎么选

各平台数字人实测:免费数字人平台哪款值得用?真人克隆和商用出片怎么选 如果你正在找免费数字人平台,大概率已经刷到过很多类似说法:这个平台永久免费,那个平台一键生成,这个平台像真人,那个平台…

2026/7/15 21:11:16 阅读更多 →

日新闻

YOLO11 改进 - 特征融合 | STFFM空间时间特征融合模块,强化时空互补、抑制噪声,助力小目标检测高效涨点

YOLO11 改进 - 特征融合 | STFFM空间时间特征融合模块,强化时空互补、抑制噪声,助力小目标检测高效涨点

前言 本文介绍了面向红外小目标检测的时空特征融合模块——STFFM,用于增强复杂背景下目标与噪声、杂波的区分能力。该方法通过拼接空间特征与时间/运动特征,并结合通道注意力、空间注意力和残差增强机制,实现对关键语义通道与疑似目标区域的…

2026/7/15 0:01:00 阅读更多 →
YOLO26 改进 - 特征融合 | STFFM空间时间特征融合模块,强化时空互补、抑制噪声,助力小目标检测高效涨点

YOLO26 改进 - 特征融合 | STFFM空间时间特征融合模块,强化时空互补、抑制噪声,助力小目标检测高效涨点

前言 本文介绍了面向复杂背景小目标检测的时空特征融合模块——STFFM。该模块通过空间分支与时间/运动分支的特征拼接,引入通道注意力和空间注意力对融合特征进行自适应筛选,并结合残差增强与通道压缩,突出目标区域、抑制背景噪声。我们将 S…

2026/7/15 0:01:00 阅读更多 →
行星减速机为什么能提高扭矩?从功率守恒到输出扭矩校核

行星减速机为什么能提高扭矩?从功率守恒到输出扭矩校核

一、为什么减速以后扭矩会增大 旋转机械的功率、转速和扭矩之间存在以下关系: T 9550 P n 其中: T为扭矩,单位Nm; P为功率,单位kW; n为转速,单位r/min。 在功率基本不变的情况下:…

2026/7/15 0:03:00 阅读更多 →

周新闻

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨 在一个阳光明媚的上午,互联网大厂的面试官坐在桌前,准备迎接他的面试候选人——燕双非,一个以搞笑和幽默著称的程序员。第一轮提问 面试官:燕双非,作…

2026/7/15 21:09:01 阅读更多 →
车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估

车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估

车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估在智能驾驶和车联网技术快速发展的今天,车载以太网作为新一代车载网络的核心传输技术,其物理层性能直接决定了数据传输的可靠性和稳定性。1000BASE-T1作为当前主流的…

2026/7/15 19:42:20 阅读更多 →
VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战,5步完成Keil工程转换

VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战,5步完成Keil工程转换

VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战指南嵌入式开发领域正经历一场工具链的静默革命。当传统Keil用户首次打开VSCode的扩展市场搜索EIDE时,往往会惊讶于这个看似简单的插件竟能重构十余年的开发习惯。本文将揭示如何用五个精准步骤&#xff0…

2026/7/15 17:52:08 阅读更多 →

月新闻