← 学习中心

JVM:Java 内存模型 JMM 与 volatile

JMM 的可见性/原子性/有序性,volatile 的语义与局限,happens-before 规则。

本节你将能

说清多线程下为什么会出现可见性与重排,volatile 能解决什么、不能解决什么。

核心要点

  • JMM 目标:屏蔽硬件差异,定义线程与主存的抽象关系(工作内存/主存)。
  • 三大特性:原子性、可见性、有序性;volatile 保证可见性+有序性,不保证复合操作原子性。
  • volatile 写立即可见、禁止指令重排(内存屏障);适合状态标志、双重检查锁的实例字段。
  • happens-before:程序次序、volatile、锁、线程启动/终止等规则,是可见性的判定依据。
  • DCL 单例必须把 instance 声明 volatile,否则可能拿到半初始化对象。

面试连招

常被追问:volatile 能替代锁吗?i++ 为什么不是原子的?happens-before 有哪些?

常见坑

用 volatile 修饰自增计数以为线程安全;忽略重排导致的单例半初始化。

JVM:Java 内存模型 JMM 与 volatile | 必学必会