JMM原理篇

简介: JMM(Java Memory Model,Java内存模型)是Java中用于描述多线程程序中内存访问规则的规范。它定义了线程如何与主内存进行交互,以及线程之间如何共享变量。下面我们来深度解析JMM模型的底层实现,并且带上源码进行讲解。

Java中的JMM模型是建立在硬件的内存模型之上的,它通过一系列规则来限制编译器和处理器对内存的重排序,以保证多线程程序的正确性。JMM模型中最重要的概念是主内存和工作内存。

主内存是Java虚拟机中的一块内存区域,是所有线程共享的。它存储了所有的变量和对象,包括实例字段、静态字段和数组元素。主内存可以被多个线程同时访问。

工作内存是每个线程独有的一块内存区域,它存储了线程需要使用的变量和对象的副本。线程对变量的所有操作都是在工作内存中进行的,而不是直接在主内存中进行。

JMM模型通过一系列规则来描述线程如何与主内存进行交互。其中最重要的规则包括:原子性、可见性和有序性。

原子性保证了一个操作是不可分割的,要么完全执行,要么不执行。JMM模型保证了基本数据类型的读写操作具有原子性。而对于非原子性的操作,可以使用synchronized或者volatile关键字进行同步。

可见性保证了当一个线程修改了变量的值,其他线程能够立即看到这个修改。JMM模型通过在特定的时机刷新变量的值到主内存,以及在特定的时机将主内存中的变量值刷新到工作内存,来实现可见性。volatile关键字可以保证变量的可见性。

有序性保证了程序执行的顺序与代码的编写顺序一致。JMM模型通过禁止特定类型的重排序来保证有序性。volatile关键字和synchronized关键字都可以保证有序性。

下面是一段示例代码,我们来看看JMM模型在实际代码中的应用:

public class JMMExample {
    private static boolean flag = false;
    public static void main(String[] args) throws InterruptedException {
        Thread thread1 = new Thread(() -> {
            while (!flag) {
                // do something
            }
            System.out.println("Thread 1 finished");
        });
        Thread thread2 = new Thread(() -> {
            flag = true;
            System.out.println("Thread 2 finished");
        });
        thread1.start();
        Thread.sleep(1000); // 确保thread1先启动
        thread2.start();
    }
}

在这个例子中,我们有两个线程,一个线程不断地检查flag的值,另一个线程修改flag的值。我们希望当flag的值变为true时,第一个线程能够停止循环并输出"Thread 1 finished"。

但是,由于JMM模型的可见性规则,第一个线程可能无法看到flag的修改,导致无法停止循环。为了解决这个问题,我们可以将flag声明为volatile

private static volatile boolean flag = false;

这样就能够保证变量的可见性,第一个线程能够正确地看到flag的修改。

以上是对JMM模型底层实现的简单解析,带上了代码示例。深入了解JMM模型的实现原理对于编写多线程程序非常重要,可以帮助我们避免出现并发相关的问题。

目录
相关文章
|
存储 算法 C++
C/C++工程师面试题(STL篇)
C/C++工程师面试题(STL篇)
314 6
|
数据可视化 前端开发 数据挖掘
【优秀python大屏】基于python flask的广州历史天气数据应用与可视化大屏
本文介绍了一个基于Python Flask框架的广州历史天气数据应用与可视化大屏系统,该系统通过数据采集、处理、分析和可视化技术,提供了丰富的气象数据展示和决策支持,帮助用户快速了解和应对气象变化。
467 110
【优秀python大屏】基于python flask的广州历史天气数据应用与可视化大屏
|
XML Java 关系型数据库
Springboot启动时报错Property ‘mapperLocations‘ was not specified.
Springboot启动时报错Property ‘mapperLocations‘ was not specified.
668 2
|
11月前
|
机器学习/深度学习 人工智能 自然语言处理
探索AI在自然语言处理中的创新应用
本文旨在揭示人工智能技术如何革新自然语言处理领域。我们将从基础的文本分析到复杂的情感识别,逐步深入探讨AI如何提升语言理解的准确性和效率。文章将通过实际代码示例,展示AI技术在自然语言处理中的应用,并讨论其对日常生活的潜在影响。读者将获得关于AI技术在理解和生成自然语言方面的实用知识,以及如何将这些技术应用于解决现实世界问题的见解。
228 5
|
存储 JSON 索引
一文让你彻底搞懂 Python 字典是怎么实现的
一文让你彻底搞懂 Python 字典是怎么实现的
407 13
|
开发工具 git
git报错 Unable to create ‘D:/project/xxx/.git/index.lock‘: File exists.
git报错 Unable to create ‘D:/project/xxx/.git/index.lock‘: File exists.
1248 1
|
设计模式 前端开发 算法
前端实现23种设计模式
在前端开发中,设计模式是一种被广泛应用的解决方案,它们可以帮助我们解决各种常见的问题,并提供可维护和可扩展的代码架构。本文将介绍前端开发中的23种设计模式,从创建型、结构型和行为型三个分类角度,对每个模式进行详细的解析和实际应用示例,帮助读者更好地理解和运用这些模式。
642 3
|
机器学习/深度学习 算法 API
基于机器学习的纠错系统技术 - 智能文本纠错 API
智能文本纠错技术是针对字词错误、标点、地名、专有名词、敏感信息、意识形态等进行智能校对
580 0
|
Unix Apache Android开发
|
机器学习/深度学习 传感器 算法
【裂缝识别】基于计算机视觉实现道路裂缝识别附matlab代码
【裂缝识别】基于计算机视觉实现道路裂缝识别附matlab代码