线程终止规则规定:一个线程的所有操作happens-before其他线程对其终止状态的检测操作;即主线程调用join()等确认子线程结束后,必能看见其对共享变量的写入结果。

线程终止规则是 Java 内存模型(JMM)中 happens-before 的八条核心规则之一,它解决的是“主线程如何安全获取子线程执行结果”的可见性问题。
线程终止规则到底规定了什么?
该规则明确指出:一个线程中的所有操作,都 happens-before 于其他线程对该线程终止状态的检测操作。
换句话说:只要主线程通过 join()、isAlive() 或 Thread.getState() == TERMINATED 等方式确认子线程已结束,那么子线程里所有已完成的操作(比如对共享变量的写入),对主线程就一定是可见的。
为什么需要这条规则?
没有它,即使子线程已执行完 result = compute();,主线程调用 thread.join() 后读取 result,仍可能看到旧值(如 0 或默认值),因为:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- 子线程的写操作可能还停留在其工作内存中,未刷新到主内存
- 主线程可能从自己的工作内存或缓存中读取了过期副本
- 编译器或 CPU 可能重排序,导致主线程“提前”读取了未同步的数据
典型用法与保障逻辑
常见写法:
int result = 0;
Thread worker = new Thread(() -> {
result = heavyComputation(); // 子线程内修改共享变量
});
worker.start();
worker.join(); // ← 关键:触发 happens-before 边界
System.out.println(result); // ← 此时一定能看到子线程写入的正确值
这里的 happens-before 链是:
- 子线程中
result = ...操作 → happens-before → 子线程自然终止(隐式) - 子线程终止 → happens-before → 主线程中
join()返回 - 因此,
result = ...→ happens-before →System.out.println(result)
注意边界和常见误区
这条规则只在“终止检测完成之后”起作用:
-
worker.isAlive()返回false时才构成终止检测,返回true不触发保证 -
worker.interrupt()本身不触发该规则;只有后续检测到中断并退出,才纳入终止语义 - 不能替代同步:若多个线程并发修改同一变量,仅靠
join()无法保证中间过程的原子性,仍需锁或 CAS

















