news 2026/8/7 22:12:17

【Java-JMM】Happens-before原则

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【Java-JMM】Happens-before原则

心理解:如果操作 A happens-before 操作 B,那么 A 的执行结果对 B 可见。这个原则主要解决了 Java 并发编程中的两个关键问题:

可见性问题:由 CPU 缓存引起

有序性问题:由编译器优化和指令重排引起

二、Happens-before 的具体规则#

1. 程序顺序性规则#

在单线程中,按照程序代码顺序,前面的操作 happens-before 后面的操作。

关键点:

有依赖关系:操作间存在数据依赖时,顺序不可重排

无依赖关系:操作间无数据依赖时,可以重排序,但要保证单线程执行结果不变

int a = 1; // 操作A

int b = 2; // 操作B(与A无依赖,可重排)

int c = a + 1; // 操作C(依赖A,必须在A之后)

int d = b * 2; // 操作D(依赖B,必须在B之后)

// 可能的执行顺序:

// ✓ A → B → C → D(原始顺序)

// ✓ B → A → C → D(B与A无依赖,可交换)

// ✗ C → A → B → D(C依赖A,不能在A之前)

2. volatile 变量规则#

对 volatile 变量的写操作 happens-before 后续对该变量的读操作。

volatile int flag = 0;

// 线程A

flag = 1; // 写操作

// 线程B

if (flag == 1) { // 读操作

// 能看到线程A的写入

}

3. 传递性规则#

如果 A happens-before B,且 B happens-before C,那么 A happens-before C。

4. 锁规则(Monitor Lock Rule)#

对一个锁的解锁操作 happens-before 后续对这个锁的加锁操作。

synchronized (lock) {

// 临界区代码

} // 解锁

// 其他线程

synchronized (lock) { // 加锁

// 能看到前一个线程在临界区的所有操作

}

5. 线程启动规则#

线程 A 中调用线程 B 的 start() 方法之前的所有操作,happens-before 线程 B 中的任意操作。

6. 线程终止规则#

线程 B 中的所有操作 happens-before 线程 A 中调用 B.join() 方法成功返回后的操作。

public class VisibilityDemo {

static int var = 0;

public static void main(String[] args) throws InterruptedException {

// 主线程操作

var = 10; // ① 主线程修改

Thread B = new Thread(() -> {

// 子线程B能看到①的修改(线程启动规则)

var = 66; // ② 子线程修改

});

B.start(); // 启动子线程

B.join(); // 等待子线程结束

// ③ 主线程能看到②的修改(线程终止规则)

System.out.println(var); // 输出:66

}

}

执行流程:

根据线程启动规则:主线程的 var = 10 happens-before 子线程 B 的所有操作

根据线程终止规则:子线程 B 的 var = 66 happens-before 主线程 join() 之后的操作

因此主线程最终能看到 var 的值为 66

7. final 字段规则#

在构造函数中对 final 字段的写入,happens-before 其他线程对该对象的 final 字段的读取。

public class FinalExample {

private final int value;

public FinalExample(int value) {

this.value = value; // 构造函数中的写入

}

// 其他线程读取时,保证能看到构造函数中的赋值

public int getValue() {

return value;

}

}

三、总结#

Happens-before 原则是 Java 并发编程的基石,它通过定义操作间的可见性关系,让开发者能够在不了解底层硬件细节的情况下,编写正确的并发程序。掌握这些规则,是写出线程安全代码的关键。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/7 2:00:49

【python大数据毕设实战】哮喘患者症状数据可视化分析系统、Hadoop、计算机毕业设计、包括数据爬取、数据分析、数据可视化、机器学习

🍊作者:计算机毕设匠心工作室 🍊简介:毕业后就一直专业从事计算机软件程序开发,至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。 擅长:按照需求定制化开发项目…

作者头像 李华
网站建设 2026/8/7 1:15:21

9 个降AI率工具,MBA 必备避坑指南

9 个降AI率工具,MBA 必备避坑指南 AI降重工具:MBA论文的智能护航 MBA论文写作过程中,越来越多的学生开始依赖AI工具进行内容生成。然而,随着高校对AIGC率的严格管控,如何在保持论文原创性和学术规范的同时,…

作者头像 李华
网站建设 2026/8/7 12:36:12

Windows系统文件inetmib1.dll丢失损坏 下载修复方法

在使用电脑系统时经常会出现丢失找不到某些文件的情况,由于很多常用软件都是采用 Microsoft Visual Studio 编写的,所以这类软件的运行需要依赖微软Visual C运行库,比如像 QQ、迅雷、Adobe 软件等等,如果没有安装VC运行库或者安装…

作者头像 李华
网站建设 2026/8/7 11:40:53

Boost电路的右半平面零点

3.1、为什么存在这个右零点?(关键点:先储能再释放)答:右零点不是数学上的巧合,而是由Boost电路独特的能量传输方式决定的。其物理过程可以这样理解:假设电路已经稳定工作,此时我们突…

作者头像 李华
网站建设 2026/8/5 3:54:03

【全球AI伦理治理】

AI伦理治理框架的全球协同案例 欧盟《人工智能法案》提出基于风险分级的四层治理体系,禁止社会评分等高风险应用。OECD的AI政策观察站已收录全球700余项政策倡议,形成跨国数据库共享机制。新加坡的Model AI Governance Framework为亚洲企业提供可认证的伦…

作者头像 李华
网站建设 2026/8/7 22:13:05

毕业季必看!7款免费AI写论文神器实测,一站式搞定选题、大纲到降重

如果你是正在熬夜赶Deadline的毕业生,或是面临着科研压力、被导师催稿的研究生,又或是没钱又要写高质量论文的大学生,那么这篇文章简直就是为你量身打造的!在学术的道路上,我们都曾经历过论文选题的迷茫、写作过程的煎…

作者头像 李华