【Java核心高阶进阶】22-happens-before与内存屏障
22 | happens-before 原则与内存屏障
模块五:Java内存模型与并发基础 · 第 2 篇
happens-before 是 JMM 给开发者的"可见性承诺",内存屏障则是 JMM 落实承诺的底层手段。
一、从重排序说起
在理解 happens-before 之前,必须先直面一个令人不安的事实:你写的代码顺序,并不等于它的执行顺序。
重排序分为三类:
- 编译器重排序:javac 和 JIT 在不改变单线程语义的前提下,重新安排语句顺序。
- 指令级并行重排序:现代 CPU 采用流水线与乱序执行,多条指令可能重叠或调换执行。
- 内存系统重排序:CPU 的写缓冲和缓存导致 store/load 的可见顺序与执行顺序不一致。
这三层重排序在单线程下都遵守"as-if-serial"语义——执行结果与顺序执行一致,所以你感知不到。但多线程下,它们会导致可见性错乱。JMM 需要在"允许优化"和"保证正确"之间找平衡,happens-before 就是这个平衡的产物。
二、happens-before 的 8 大规则
happens-before 是 JMM 的核心概念,由 JSR-133 明确定义。它表达的
