Java 内存模型(JMM)的原子操作

举报
William 发表于 2025/02/07 09:21:05 2025/02/07
【摘要】 Java 内存模型(JMM)的原子操作 介绍Java 内存模型(Java Memory Model, JMM)定义了 Java 程序中变量的可见性和有序性。它描述了线程与内存之间的交互,尤其是主内存与工作内存之间的数据传递过程。JMM 提供了一些基本的原子操作,以确保线程间通信的一致性和正确性。 原子操作JMM 中关于主内存和工作内存的交互被划分为以下八种原子操作:lock(锁定):作用于...

Java 内存模型(JMM)的原子操作

介绍

Java 内存模型(Java Memory Model, JMM)定义了 Java 程序中变量的可见性和有序性。它描述了线程与内存之间的交互,尤其是主内存与工作内存之间的数据传递过程。JMM 提供了一些基本的原子操作,以确保线程间通信的一致性和正确性。

原子操作

JMM 中关于主内存和工作内存的交互被划分为以下八种原子操作:

  1. lock(锁定):作用于主内存变量,把变量标识为一条线程独占状态。
  2. unlock(解锁):作用于主内存变量,解除锁定,使得其他线程可以访问此变量。
  3. read(读取):将一个变量的值从主内存传输到工作内存中。
  4. load(加载):将 read 操作获得的变量放入工作内存的某个区域。
  5. use(使用):把工作内存中的变量值传递给执行引擎。
  6. assign(赋值):把执行引擎接收到的值赋给工作内存中的变量。
  7. store(存储):把工作内存中的变量传送至主内存中以等待后续写入。
  8. write(写入):将 store 操作得到的变量在主内存的区域中更新。

这些操作共同协调着变量在线程之间的安全同步,特别是在多线程环境下。

应用使用场景

  • 多线程编程:确保共享变量在不同线程间的可见性和一致性。
  • 并发算法:设计高效的并行算法,例如无锁数据结构。
  • JVM 优化:理解底层内存交互以进行性能优化。

原理解释

Java 内存模型

JMM 是 Java 虚拟机规范的一部分,它定义了线程如何通过内存进行交互。在 Java 中,每个线程都有一个私有的工作内存,这就是运行时栈。在这个栈中存储了所有的局部变量、调用堆栈和一些临时数据。主内存则包含了所有实例域、静态域和数组元素。

线程从主内存中读取变量到自己的工作内存中进行操作,然后再写回到主内存。JMM 确保了这种读写操作的有序性及一致性。

算法原理流程图

+-----------+
|  主内存   |
+-----------+
     ^
     | read
     v
+-----------+
| 工作内存  |
+-----------+
     ^
     | load
     v
+----------+
| 执行引擎 |
+----------+
     ^
     | use / assign
     v
+-----------+
| 工作内存  |
+-----------+
     ^
     | store
     v
+-----------+
|  主内存   |
+-----------+

算法原理解释

  1. 从主内存读取:线程将变量从主内存 read 到工作内存,并通过 load 加载。
  2. 执行操作:工作内存中的值通过 use 传输给执行引擎,处理结果通过 assign 返回。
  3. 更新主内存:经过 store 后,工作内存的数据准备好写入主内存,最终通过 write 完成更新。

实际详细应用代码示例实现

下面是一个简单的 Java 示例,演示了多线程场景下的内存可见性问题和如何通过 volatile 关键字来解决:

public class VisibilityDemo {
    private static volatile boolean running = true;

    public static void main(String[] args) throws InterruptedException {
        Thread worker = new Thread(() -> {
            while (running) {
                // 模拟工作
            }
            System.out.println("Worker stopped.");
        });

        worker.start();

        Thread.sleep(1000);
        running = false; // 终止线程
        System.out.println("Main thread set running to false.");
    }
}

测试步骤以及详细代码、部署场景

  1. 编写代码

    • 将上述代码保存为 VisibilityDemo.java
  2. 编译并运行

    • 使用命令 javac VisibilityDemo.java 编译,然后通过 java VisibilityDemo 运行程序。
  3. 观察输出

    • 验证程序是否按预期停止 worker 线程,且 volatile 可以确保其他线程看到变量的最新值。

材料链接

总结

JMM 提供的原子操作为 Java 的多线程编程奠定了基础,通过正确理解这些操作,可以编写更高效、更安全的并发程序。使用 volatile 和锁等工具,可以有效解决可见性和有序性问题。

未来展望

随着硬件架构的复杂化和多核处理器的普及,对并发编程的要求将越来越高。JMM 将继续发展以适应新技术,并提供更多语言级支持,以便开发者更容易编写高性能并发程序。此外,新的并发抽象和工具也将逐步引入,为开发者提供更多选择。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。