侧边栏壁纸
博主头像
IT充电站博主等级

看过故人终场戏,淡抹最适宜

  • 累计撰写 48 篇文章
  • 累计创建 13 个标签
  • 累计收到 2 条评论

目 录CONTENT

文章目录

内存模型的理解(JMM)

陈汉林
2024-05-24 / 0 评论 / 1 点赞 / 20 阅读 / 2465 字

ava内存模型(Java Memory Model, JMM)是Java虚拟机(JVM)的一个核心概念,它规定了一个Java程序在多线程环境中,各个线程之间如何通过内存进行通信、共享变量的可见性、以及如何同步等。JMM 定义了以下几个关键方面:

1. 主内存(Main Memory)

Java内存模型规定所有变量都存储在主内存中,不管它们是成员变量、局部变量还是静态变量。主内存是所有线程共享的内存区域。

2. 工作内存(Working Memory)

每个线程都有自己的工作内存,用于存储该线程使用的变量的副本。线程对变量的所有操作(读取、赋值)都必须在工作内存中进行,而不能直接读写主内存中的变量。

3. 变量可见性

在JMM中,当一个线程修改了一个共享变量的值,其他线程可能无法立即看到这个修改。为了让其他线程能看到这个修改,需要执行一些特定的操作(如使用volatile关键字或synchronized同步),使得修改后的值从工作内存刷新到主内存中,其他线程才能看到。

4. 原子性

原子性是指一个操作或者一系列操作要么全部执行,要么全部不执行。在Java内存模型中,除了long和double的非原子操作外,其余的操作都是原子的。可以通过synchronized和java.util.concurrent包中的原子类来保证复合操作的原子性。

5. 有序性

在单线程程序中,代码执行的顺序是清晰的,但在多线程程序中,由于线程间的交叉执行,指令重排序可能导致不可预期的结果。JMM允许编译器和处理器对代码进行重排序,但保证不会改变单线程程序的执行结果。为了确保多线程程序中的有序性,可以使用volatile关键字或synchronized同步机制。

6. 同步

Java内存模型定义了两种同步机制:锁(隐式锁,通过synchronized关键字实现)和锁(显示锁,通过java.util.concurrent.locks.Lock接口实现)。这两种机制都可以确保一个时刻只有一个线程能够执行特定代码块,并且确保操作的原子性和内存的可见性。

7. happens-before原则

JMM通过happens-before原则定义了一种偏序关系,确保一个操作的结果能够对其他操作可见。如果一个操作happens-before另一个操作,那么第一个操作的结果对第二个操作可见。

示例代码

public class Counter {
    private volatile int count = 0;

    public void increment() {
        count++; // 操作1: 工作内存中count值加1
    }

    public int getCount() {
        return count; // 操作2: 从主内存中读取count的值
    }
}

在这个示例中,由于count变量被声明为volatile,因此对count的写操作(increment方法中的count++)会立即刷新到主内存中,并且其他线程在读取count(getCount方法)时能够立即看到这个修改。

总的来说,Java内存模型是理解Java并发编程的基础,它定义了多线程程序中的内存一致性和线程之间的协作机制。

1
  1. 支付宝打赏

    qrcode alipay
  2. 微信打赏

    qrcode weixin

评论区