对象终结规则指对象初始化完成happens-before其finalize()方法开始,确保finalize中可见构造时写入的字段值;传递性规则指若a happens-before b且b happens-before c,则a happens-before c,使分散同步点形成可靠可见性链。

对象终结规则和传递性规则是 Happens-Before 原则中容易被忽略但逻辑严密的两条。它们不直接控制线程同步,而是为 JVM 的资源清理和操作推理提供底层保障。
对象终结规则:构造完成 → finalize() 开始
这条规则明确:一个对象的初始化(即构造函数执行完毕)happens-before 它的 finalize() 方法开始执行。
- 它不是说“构造完立刻调用 finalize”,而是定义了一种强制的逻辑先后关系——只要
finalize()被 JVM 触发,那它一定能看到构造过程中写入的所有字段值(前提是这些字段没被其他线程并发修改)。 - 注意:该规则只对
finalize()生效,且仅在对象确定不可达、即将被回收时起作用;现代 Java 已强烈不推荐使用finalize(),但它仍是 JMM 定义的语义边界之一。 - 典型场景:构造函数里设置了一个 final 字段或普通字段,后续
finalize()中读取该字段,JMM 保证读到的是构造时写入的值,不会看到默认值或中间态。
传递性规则:A → B → C ⇒ A → C
这是 Happens-Before 的“逻辑链路”基础——如果操作 A happens-before 操作 B,B happens-before 操作 C,那么 A 就自动 happens-before C,无需额外同步手段。
- 它让多条独立规则能组合生效。比如:线程 A 写 volatile 变量 v(A→v 写),线程 B 读 v 后加锁修改共享变量 x(v 读→x 写),线程 C 加锁读 x(x 写→x 读)。通过传递性,A 的写操作就间接对 C 可见。
- 传递性不依赖物理时间顺序,也不要求中间操作实际发生;只要每一对之间满足规则(如程序顺序、volatile、锁等),整条链就成立。
- 常见误用:只同步部分操作(比如只给写加 synchronized,读不加),会断掉传递链,导致可见性失效。
这两条规则共同支撑了 JMM 的可推理性:终结规则守住对象生命周期终点的语义边界,传递性规则把分散的同步点连成一张可靠的关系网。它们本身不提供同步动作,但让开发者能基于明确规则做安全推断。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











