JVM:Java 内存模型 JMM 与 volatile
JMM 的可见性/原子性/有序性,volatile 的语义与局限,happens-before 规则。
本节你将能
说清多线程下为什么会出现可见性与重排,volatile 能解决什么、不能解决什么。
核心要点
- JMM 目标:屏蔽硬件差异,定义线程与主存的抽象关系(工作内存/主存)。
- 三大特性:原子性、可见性、有序性;volatile 保证可见性+有序性,不保证复合操作原子性。
- volatile 写立即可见、禁止指令重排(内存屏障);适合状态标志、双重检查锁的实例字段。
- happens-before:程序次序、volatile、锁、线程启动/终止等规则,是可见性的判定依据。
- DCL 单例必须把 instance 声明 volatile,否则可能拿到半初始化对象。
面试连招
常被追问:volatile 能替代锁吗?i++ 为什么不是原子的?happens-before 有哪些?
常见坑
用 volatile 修饰自增计数以为线程安全;忽略重排导致的单例半初始化。