多线程(52)Java内存模型(JMM)

Java内存模型(JMM)是Java虚拟机(JVM)的一部分,它定义了Java程序中各种变量(线程中的本地变量、堆中的对象、类中的静态字段等)的访问规则,以及在多线程环境中如何和何时可以看到由其他线程修改过的共享变量的值。JMM对于实现高性能、可靠的并发应用程序至关重要。

JMM的主要目标:

  1. 定义程序中变量的访问规则:确保线程执行程序代码时能正确地读取到变量的值,无论变量被另一个线程在何处、何时修改。
  2. 提供可见性和有序性保证:确保一个线程对共享变量的修改对其他线程可见(可见性),并且在多线程环境中对于共享变量的访问是有序的(有序性)。
  3. 提供原子性保证:对基本读取和写入操作的原子性保证。

JMM的关键特性:

1. 可见性

当一个线程修改了共享变量的值,其他线程能够立即知道这个修改。Java提供了volatile关键字来保证变量的修改对所有线程立即可见。

2. 原子性

Java提供了synchronizedLock机制来保证代码块在多线程环境中的原子性执行。

3. 有序性

Java中,有序性是通过happens-before原则来保证的,这个原则是JMM中最核心的概念之一。

happens-before原则

happens-before关系是逻辑上定义两个操作之间的偏序关系。如果一个操作A happens-before操作B,那么JMM将保证A操作的结果对B操作可见,且A的操作顺序在B之前。

happens-before规则包括:

  • 程序顺序规则:在同一个线程中,按照程序代码顺序,前面的操作happens-before于后续的任何操作。
  • 监视器锁规则:解锁(unlock)happens-before于随后的对同一个锁的加锁(lock)。
  • volatile变量规则:对volatile字段的写操作happens-before于后续对这个volatile字段的读操作。
  • 传递性:如果A happens-before B,且B happens-before C,那么A happens-before C。

代码示例

下面是使用volatile关键字实现的一个可见性示例:

java 复制代码
public class VolatileExample {
    private volatile boolean flag = false;

    public void writer() {
        flag = true; // 写操作
    }

    public void reader() {
        if (flag) { // 读操作
            System.out.println("Flag is true");
        }
    }
}

在这个例子中,flag变量被标记为volatile。这意味着对这个变量的写操作会立即对其他线程可见,而且读取操作会看到最近一次的写入。

内存屏障

JMM是通过内存屏障(Memory Barriers)来实现happens-before原则的。内存屏障是一种CPU指令,用于控制特定类型的操作的执行顺序。JMM利用这些内存屏障来禁止特定类型的操作重排序。

  • Load Barrier(加载屏障):确保之后的读操作不会和屏障之前的读写操作重排序。
  • Store Barrier(存储屏障):确保之前的写操作不会和屏障之后的读写操作重排序。

总结

JMM定义了Java多线程程序中变量的读写规则,以及线程之间如何通过共享变量进行通信。它通过volatilesynchronizedLock等机制提供了一套规则和保证,让开发者可以编写出更加安全、高效的并发程序。理解JMM是实现正确的并发程序的关键。

相关推荐
陈随易4 小时前
在 VSCode 里,把项目一键部署到服务器
前端·后端·程序员
鱼樱前端4 小时前
我用 Claude Code 后,编码效率翻 3 倍。但更值钱的是别的。
前端·后端·ai编程
犀利豆5 小时前
Claude code tools 研究系列-开篇(AskUserQuestion)
后端
颜酱8 小时前
06 | 把 meta_config 同步进 MySQL(生成阶段)
前端·人工智能·后端
IT_陈寒9 小时前
SpringBoot自动配置坑了我一周,原来问题这么蠢!
前端·人工智能·后端
iOS开发上架哦10 小时前
Android代码混淆与iOS加固技术详解
后端·ios
Alan_69110 小时前
商品详情优化三板斧-拆分-多级缓存-GC调参
后端·缓存
Conan在掘金10 小时前
ArkTS 进阶之道(3):为哈禁解构声明?类型一眼可见 vs 推断链断裂
后端
晚安code10 小时前
干掉成山的 if-else:工厂造、策略选,一文讲透两个模式的配合
后端·设计模式
feng尘10 小时前
深度解析布隆过滤器(Bloom Filter):原理、优缺点与 1000 万黑名单实战
后端·面试