volatile解决“改了能否立刻被看到”,通过内存屏障保证可见性与有序性但不保证原子性;synchronized解决“正在改时不准插手”,通过锁机制实现原子性、可见性、有序性三重保障。

volatile 和 synchronized 的本质区别,不在于“谁更轻量”或“谁更快”,而在于它们解决并发问题的底层机制和能力边界完全不同。
volatile 只管“变量值的及时传达”
它通过内存屏障强制读写直连主内存,确保:一个线程写完 volatile 变量,其他线程下一次读一定能拿到最新值;同时禁止编译器和处理器对该变量的读写做重排序。但它不管操作过程是否被拆开——比如 count++(读→加1→写回)这种三步操作,volatile 完全不干预中间步骤,多个线程同时执行仍会丢失更新。
- 适用场景:状态标志(如
running = false)、单次写入后只读的配置、双重检查锁里的实例引用 - 不能用于:计数器自增、累加、条件判断后赋值等含复合逻辑的操作
synchronized 是“临界区的整体接管”
它不只是同步某个变量,而是对一段代码块或整个方法施加排他控制。进入时清空工作内存、从主内存重载变量;退出时把所有修改刷回主内存。这个“加锁–执行–解锁”的完整流程,天然带来三重保障:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 原子性:临界区内所有语句被视为一个不可分割单元,不会被线程切换打断
- 可见性:进出锁时的内存同步,让变量修改对后续持锁线程立即可见
- 有序性:JMM 锁规则禁止临界区内外指令重排序
关键差异不是“能不能”,而是“管不管”
volatile 不提供互斥,也不建立执行顺序约束,它只是让变量“不滞后”;synchronized 则是主动建立执行秩序——先到先得、串行化执行、全程内存同步。所以:
立即学习“Java免费学习笔记(深入)”;
- 用 volatile 修饰
boolean shutdown,可以安全通知线程退出 - 但若想安全实现
if (balance > amount) balance -= amount;,必须用 synchronized(或 Lock/Atomic 类) - 两者不互斥:volatile 常配合 synchronized 使用,比如在锁外读 volatile 标志快速判断是否需进锁
说到底,volatile 解决的是“我改了,你能不能立刻看到”,synchronized 解决的是“我正在改,你不准插手,改完你也得看见”。目标不同,机制自然不同。

















