java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java内存模型JMM

Java内存模型JMM深入解析

作者:rchmin

JMM(Java内存模型)规范了多线程环境下Java程序中变量的内存访问规则,解决了可见性、原子性和有序性问题,通过关键字和规则确保多线程程序的正确性和线程安全性,本文介绍Java内存模型JMM的相关知识,感兴趣的朋友一起看看吧

1. 什么是 JMM?

JMM 的全称是 Java Memory Model,即 Java 内存模型

简单来说,JMM 是一套规范,它定义了在多线程环境下,Java 程序中的变量(特别是共享变量)如何被写入内存以及如何从内存中读取的规则。

关键点:

2. 为什么需要 JMM?(JMM 要解决的问题)

在没有 JMM 约束的情况下,多线程编程会面临三大核心难题,这主要是由于现代计算机架构(如多级缓存、CPU 指令重排序)造成的。

1. 可见性

// 共享变量
private static boolean flag = false;
public static void main(String[] args) {
    new Thread(() -> {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        flag = true; // 线程A修改flag为true
        System.out.println("Flag set to true.");
    }).start();
    new Thread(() -> {
        while (!flag) { 
            // 线程B可能永远无法跳出循环,因为它看不到线程A对flag的修改
        }
        System.out.println("Thread sees flag change.");
    }).start();
}

在没有同步措施的情况下,第二个线程可能会陷入死循环。

2. 原子性

3. 有序性

public class Singleton {
    private static Singleton instance; // 没有volatile
    public static Singleton getInstance() {
        if (instance == null) { // 第一次检查
            synchronized (Singleton.class) {
                if (instance == null) { // 第二次检查
                    instance = new Singleton(); // 非原子操作,可能发生重排序
                }
            }
        }
        return instance;
    }
}

instance = new Singleton() 这行代码在 JVM 中大致做了三件事:

3. JMM 是如何解决这些问题的?

JMM 通过定义一些关键的 关键字 和 规则 来解决上述问题,主要是围绕 主内存 和 工作内存 之间的交互协议。

核心手段:

总结

特性问题描述JMM 解决方案
原子性操作被中途打断synchronized
可见性一个线程的修改对其他线程不可见synchronizedvolatile, Happens-Before
有序性指令执行顺序与代码顺序不一致synchronizedvolatile, Happens-Before

一句话总结:
JMM(Java内存模型)是一套规范,它屏蔽了底层硬件内存访问的差异,为 Java 开发者提供了一套统一的内存访问模型,使得我们在编写多线程程序时,即使在不了解底层硬件细节的情况下,也能通过使用 synchronizedvolatile 等关键字,编写出正确、线程安全的代码。

到此这篇关于Java内存模型JMM深入解析的文章就介绍到这了,更多相关Java内存模型JMM内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文