内存屏障,写屏障和读屏障

本文介绍了Java内存模型(JMM)的核心概念,包括主内存、工作内存、原子性、可见性和有序性,重点阐述了写屏障和读屏障如何确保线程间的内存可见性和指令重排序一致性,对于理解和开发多线程应用至关重要。
摘要由CSDN通过智能技术生成

目录

jmm:

写屏障和读屏障


jmm:

Java 内存模型(Java Memory Model,简称 JMM)是一种规定了多线程环境中共享变量的访问规则的模型。它确保了在不同线程之间的可见性、有序性和原子性。以下是关于 Java 内存模型的一些关键概念:

  1. 主内存(Main Memory):

    • 主内存是所有线程共享的内存区域,用于存储变量的值。所有线程都可以访问主内存中的变量。
  2. 工作内存(Working Memory):

    • 每个线程都有自己的工作内存,用于存储主内存中的变量的副本。线程只能直接在工作内存中读写变量,不能直接读写主内存。
  3. 读操作和写操作:

    • 当线程需要使用变量的值时,它会从主内存中读取变量的值到自己的工作内存。当线程修改变量的值时,它会先修改自己工作内存中的副本,然后再将修改后的值写回主内存。
  4. 原子性操作:

    • JMM 确保了基本数据类型(如 int 和 long)的读取和赋值操作是原子性的。这意味着在一个线程执行读或写操作期间,其他线程不能中断或看到中间状态。
  5. 可见性:

    • JMM 确保了一个线程对变量的修改对其他线程是可见的。这是通过在写操作时将变量的修改值刷新到主内存,以及在读操作时从主内存重新加载变量的值来实现的。
  6. 有序性:

    • JMM 确保了程序执行的顺序不会受到编译器优化、处理器的乱序执行等因素的影响。通过在指令序列中插入特定的内存屏障来实现有序性。
  7. 内存屏障(Memory Barriers):

    • 内存屏障是指令序列中的一种特殊指令,它能够禁止在屏障之前和之后的指令被重排序。在多线程环境中,内存屏障用于确保执行顺序的一致性。就是我们下面的读屏障和写屏障 0.0

Java 内存模型的设计旨在在多线程环境中提供一致的、可预测的内存访问行为,以确保程序的正确性和稳定性。理解 JMM 对于开发多线程应用程序非常重要,以避免出现并发性问题和线程安全性问题。

写屏障和读屏障

写屏障和读屏障是Java内存模型(JMM)中的概念,用于确保线程之间的内存可见性和指令重排序的一致性。下面我会分别解释它们的作用:

  1. 写屏障(Write Barrier)

    • 写屏障是一个同步操作,确保在写入操作之后,所有的修改都会立即被刷新到主内存中,以确保其他线程能够看到这些修改。
    • 在Java中,volatile变量的写入操作会插入写屏障,这意味着当一个线程写入一个volatile变量时,会立即将所有的修改刷新到主内存中,而不会将写入操作延迟到其他指令之后。
    • 写屏障可以保证写入操作的内存可见性,防止写入操作被重排序到后面的读取操作之前。
  2. 读屏障(Read Barrier)

    • 读屏障是一个同步操作,确保在读取操作之前,所有的数据都是最新的,即从主内存中读取最新的数据,而不是从线程的本地缓存中读取。
    • 在Java中,对volatile变量的读取操作会插入读屏障,这意味着当一个线程读取一个volatile变量时,会从主内存中获取最新的值,而不是使用线程本地缓存中的值。
    • 读屏障可以保证读取操作的内存可见性,防止读取操作将后续的写入操作重排序到前面。

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nanshaws

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值