深入浅出JVM系列(四):Java内存模型(JMM)

java常见面试考点

往期文章推荐:
  java常见面试考点(十六):类加载器的常见考点
  深入浅出JVM系列(一):JVM内存结构
  深入浅出JVM系列(二):垃圾收集算法
  深入浅出JVM系列(三):JVM生命周期


【版权申明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权);

本博客的内容来自于:深入浅出JVM系列(四):Java内存模型(JMM)

学习、合作与交流联系q384660495;

本博客的内容仅供学习与参考,并非营利;


一、前言

  首先。Java内存区域(运行时数据区域)和内存模型(JMM)是不一样的东西,内存区域是指 Jvm 运行时将数据分区域存储,强调对内存空间的划分。

  而内存模型(Java Memory Model,简称 JMM )是定义了线程和主内存之间的抽象关系,即 JMM 定义了 JVM 在计算机内存(RAM)中的工作方式,如果我们要想深入了解Java并发编程,就要先理解好Java内存模型。

  JMM本身是一种抽象的概念并不存在,它描述的是一种规范或规则,通过这组规范定义了程序各个变量的访问方式。

  JMM中关于同步的规定:

  1. 线程解锁前,必须把共享变量的值刷新回主内存;
  2. 线程加锁前,必须读取主内存的最新值到自己的工作内存;
  3. 加锁解锁是同一把锁;

二、计算机高速缓存和缓存一致性

  计算机在高速的 CPU 和相对低速的存储设备之间使用高速缓存,作为内存和处理器之间的缓冲。将运算需要使用到的数据复制到缓存中,让运算能快速运行,当运算结束后再从缓存同步回内存之中。

  在多处理器的系统中(或者单处理器多核的系统),每个处理器内核都有自己的高速缓存,它们有共享同一主内存(Main Memory)。

  当多个处理器的运算任务都涉及同一块主内存区域时,将可能导致各自的缓存数据不一致。

  为此,需要各个处理器访问缓存时都遵循一些协议,在读写时要根据协议进行操作,来维护缓存的一致性。

缓存一致性

三、JVM主内存与工作内存

  Java 内存模型的主要目标是定义程序中各个变量的访问规则,即在虚拟机中将变量(线程共享的变量)存储到内存和从内存中取出变量这样底层细节。

  Java内存模型中规定了所有的变量都存储在主内存中,每条线程还有自己的工作内存,线程对变量的所有操作都必须在工作内存中进行,而不能直接读写主内存中的变量。

  这里的工作内存是 JMM 的一个抽象概念,也叫本地内存,其存储了该线程以读 / 写共享变量的副本。

  就像每个处理器内核拥有私有的高速缓存,JMM 中每个线程拥有私有的本地内存。

  不同线程之间无法直接访问对方工作内存中的变量,线程间的通信一般有两种方式进行,一是通过消息传递,二是共享内存。Java 线程间的通信采用的是共享内存方式,线程、主内存和工作内存的交互关系如下图所示:

JVM主内存与工作内存

四、JMM三大特性

1、可见性

  实验代码如下所示:

/**
 * @author xiatao
 * @create 2021--05--14 15:01
 * @describe
 */
public class Exam {
   
    public static void main(String[] args) {
   
        Data data = new Data();
        new Thread(()->{
   
            System.out.println(Thread.currentThread().getName()+"\tcome in");
            try {
   
                TimeUnit
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

夏天的爱人是绿色

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

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

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

打赏作者

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

抵扣说明:

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

余额充值