volatile 笔记
说明
volatile用于告诉编译器: 该对象的值可能在程序显式控制之外发生变化.- 常见场景包括内存映射寄存器, 中断共享变量和底层设备访问.
- 它解决的是“优化过度”问题, 不是“线程同步正确性”问题.
基本含义
- 每次访问都应尽量直接从内存读取或写回.
- 编译器不应把它当成普通变量那样随意消除访问或缓存到寄存器中长期复用.
典型场景
内存映射寄存器
- 访问硬件寄存器时, 寄存器值可能由外设随时改变.
- 若不加
volatile, 编译器可能优化掉看似“重复”的读取.
中断共享变量
- 中断处理函数和主循环共享的标志位也常见
volatile. - 但如果涉及原子性和顺序要求, 仍要进一步考虑同步方案.
常见误区
误区 1: volatile 等于线程安全
- 错.
volatile不能替代原子操作, 锁或内存序控制.
误区 2: volatile 能解决所有并发可见性问题
- 错.
- 它主要限制编译器优化, 不自动建立完整的线程同步语义.
误区 3: 所有全局变量都该加 volatile
- 错.
- 滥用会降低优化效果, 也会掩盖真正的同步设计问题.
使用建议
- 面向硬件寄存器和底层设备访问时,
volatile很常见. - 面向多线程同步时, 优先使用原子类型和同步原语.
- 读代码时, 一旦看到
volatile, 应先问“这个值是谁在程序控制外改动它”.