← 每日面试题 学习看板

什么是happens-before原则?

面试题/00java/02Java 并发编程/08java内存模型JMM/什么是happens-before原则?.md

面试记录 2026-10-17

题目:什么是 happens-before 原则?

难度:low

标签:java/jmm, general/knowledge

评分:⭐⭐⭐☆☆(3/5)

我的回答

heppends-before原则是JMM,或者说JIT中防止指令重排的设定原则,规定了什么情况下不能进行重排,什么内容要在什么内容之前,在内存中指令要如何排列; 对应的底层依赖是读取和写入的规则,以及内存屏障等指令做支持; 具体的规则比较多,只说几个内存屏障相关的,读读屏障,读写屏障,写写屏障,写读屏障

点评

优点:抓住"规定先后顺序、防止乱序"的方向,也提到底层靠内存屏障。

不足:把 happens-before 等同于"防重排+内存屏障"是概念错位——HB 是 JMM 的语义偏序契约,用来定义"可见性+有序性";内存屏障只是它的实现手段之一。没说出 HB 的规则清单(面试真正要的)。

补充:八大规则(程序顺序、监视器锁、volatile 写读、线程 start/join、传递性等);"A happens-before B" 的含义是 A 的结果对 B 可见。

完整讲解

第一部分:知识重点剖析

核心考点定位:能否说清 HB 是"可见性与有序性的契约",并背出核心规则。

知识点拆解:

  1. 本质:HB 是 JMM 定义在操作之间的偏序关系。若 A hb B,则 A 的所有写对 B 可见——它回答的是"一个线程的写何时对另一个线程可见"。
  2. 核心规则:
  1. 实现:JVM 用内存屏障(LoadLoad/StoreStore/LoadStore/StoreLoad)落地 HB;volatile 插屏障、synchronized 靠 Monitor。
按「底层原理 → 设计权衡 → 工程实践」递进排列。

第二部分:考察方向与延伸递进

考察方向:

延伸递进面试题:

  1. volatile 的写/读建立什么 HB?
  1. 为什么 DCL 单例要加 volatile?
  1. happens-before 和 as-if-serial 的区别?

第三部分:面试者参考回答(三步法口语化)

【一句话结论】

面试官您好,happens-before 是 JMM 规定的一种偏序关系,用来保证"前面操作的结果对后面操作可见"。

【三点展开】

第一,它是语义契约不是实现——描述的是可见性与有序性,不是"禁止重排"本身;

第二,核心规则有程序顺序、监视器锁、volatile 写读、线程 start/join、以及传递性;

第三,底层靠内存屏障落地,volatile 插屏障、synchronized 靠 Monitor 的解锁-加锁规则。

【一句边界】

当然,它只管可见性和有序性,不保证原子性——i++ 依然线程不安全,该上锁还得上锁。