题目:什么是 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 是"可见性与有序性的契约",并背出核心规则。
知识点拆解:
start() hb 该线程内的所有操作join() 返回按「底层原理 → 设计权衡 → 工程实践」递进排列。
考察方向:
延伸递进面试题:
【一句话结论】
面试官您好,happens-before 是 JMM 规定的一种偏序关系,用来保证"前面操作的结果对后面操作可见"。
【三点展开】
第一,它是语义契约不是实现——描述的是可见性与有序性,不是"禁止重排"本身;
第二,核心规则有程序顺序、监视器锁、volatile 写读、线程 start/join、以及传递性;
第三,底层靠内存屏障落地,volatile 插屏障、synchronized 靠 Monitor 的解锁-加锁规则。
【一句边界】
当然,它只管可见性和有序性,不保证原子性——i++ 依然线程不安全,该上锁还得上锁。