如何理解Java内存模型

技术如何理解Java内存模型本篇内容主要讲解“如何理解Java内存模型”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何理解Java内存模型”吧!(一)概述很多人会把Java

本文主要讲解“如何理解Java内存模型”。感兴趣的朋友不妨看看。本文介绍的方法简单、快速、实用。让边肖带你学习如何理解Java内存模型。

(一)概述

很多人把Java内存区(运行时数据区)和Java内存模型(JMM)混为一谈,完全是两码事。

Java内存区域指的是JVM运行时数据在不同区域的存储,而Java内存模型定义了线程和主存之间的抽象关系。理解Java内存模型是学好Java并发编程的基础。

(二)Java内存模型

Java内存模型规定所有变量都存储在主内存中,每个线程都有自己的工作内存。线程对变量的所有操作都必须在工作内存中进行,但主内存中的变量不能直接读写。我们来看一张图片:

如何理解Java内存模型

每个线程都有自己的私有工作内存。当需要变量时,从主内存复制一个副本到工作内存。如果变量被更新,刷新共享变量到主内存。

但是在两个线程之间,没有办法读取彼此工作内存中的变量值。看一个例子:

publicclassTest{

privatestaticbooleanflag=false

publicationstatinvitmain(String[]args)throwsInterruptedException {

new thread(NewRunnable(){ 0

@覆盖

public void run(){ 0

System.out.println('等待');

while(!旗帜){}

system . out . println(' in ');

}

}).start();

Thread.sleep(2000年);

new thread(NewRunnable(){ 0

@覆盖

public void run(){ 0

system . out . println(' change flag ');

flag=true

sp;System.out.println("change success");
            }
        }).start();
    }
}

首先定义了一个静态变量flag为false,A线程等待flag等于true后输出in,于是我们新开一个线程将flag修改为true。结果是A线程依旧无法输出in。

如何理解Java内存模型

原理看Java内存模型的图就理解了,不同的线程修改变量,对本地线程是不可见的。

(三)JMM数据的原子操作

通过上面这段代码,我们已经知道了Java内存模型的结构,那么工作内存和主内存之间是如何读取变量又是如何修改变量的呢?JMM提供了对变量的一系列原子操作。我们先不讲理论,看个图,这个图描述了上面一段代码的执行过程:

如何理解Java内存模型

整个过程一共十步,重复几个步骤不讲了,我把不重复的六个操作列一下:

read:从主内存读取数据

load:将主内存读取到的数据写入工作内存

use :从工作内存中读取数据来使用

assign:把计算好的值重新赋值到工作内存中

store:将工作内存数据写入主内存

write:将store过去的变量赋值给主内存中的变量

通过上面的图,对下面六个原子操作的理解应该可以更加深刻了。JMM的原子操作一共有八个,下面列出剩下的两个

lock:将主内存变量加锁,标识为线程独占状态

unlock:将主内存变量解锁,解锁后其他线程可以锁定该变量

(四)JMM缓存不一致问题

从前面的例子我们已经看到了,一个线程修改完数据,另外一个线程无法立即可见,这就是JMM缓存不一致的问题,有两种解决办法:

加锁:

还记得我们没有用到过的JMM原操作的最后两个吗,lock和unlock,使用这两个操作就可以实现缓存一致性,一个线程想要获取某个主内存变量时,先使用lock将主内存变量加锁,只有他才能使用,等用完后再unlock,其他线程才能竞争。但是加锁意味着性能低。

MESI缓存一致性协议:

这个协议涉及到cpu的总线嗅探机制,从上面的JMM执行的流程图中我们可以看到当某个线程修改了共享变量后,他会回写到主内存,MESI缓存一致性协议就是通过cpu的总线嗅探机制,将其他也正在使用该变量的线程的数据失效掉,使得这些线程要重新读取主内存中的值,从而保证缓存最终一致性。

到此,相信大家对“如何理解Java内存模型”有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/42401.html

(0)

相关推荐

  • jquery如何隐藏table的tr

    技术jquery如何隐藏table的tr这篇文章主要介绍“jquery如何隐藏table的tr”,在日常操作中,相信很多人在jquery如何隐藏table的tr问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法

    攻略 2021年11月16日
  • 淘宝盖楼活动怎么做,手机淘宝店铺怎么创建活动页面

    技术淘宝盖楼活动怎么做,手机淘宝店铺怎么创建活动页面手机淘宝店铺创建活动页面步骤如下:在手机登陆到淘宝然后依次点击“卖家中心”-“店铺管理”-“手机淘宝店铺”然后在店铺设置下面点面点击“无线活动管理”;在进入的页面下点击

    生活 2021年10月25日
  • Python用哪些工具好

    技术Python用哪些工具好这篇文章主要介绍了Python用哪些工具好,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、最强终端:Upterm本来想推荐

    攻略 2021年10月28日
  • Sqlserver 2014 alwayson架构如何添加辅助节点上的数据库

    技术Sqlserver 2014 alwayson架构如何添加辅助节点上的数据库本篇文章给大家分享的是有关Sqlserver 2014 alwayson 架构如何添加辅助节点上的数据库,小编觉得挺实用的,因此分享给大家学

    攻略 2021年11月29日
  • TestComplete中如何使用VBScript脚本实现对容器控件中子对象的遍历

    技术TestComplete中如何使用VBScript脚本实现对容器控件中子对象的遍历这篇文章给大家分享的是有关TestComplete中如何使用VBScript脚本实现对容器控件中子对象的遍历的内容。小编觉得挺实用的,

    攻略 2021年11月1日
  • 形容沙尘暴的搞笑句子,形容天气寒冷的搞笑句子

    技术形容沙尘暴的搞笑句子,形容天气寒冷的搞笑句子1.寒冷的冬日,你清早的一个微笑让我暖入心底,开始美好的一天形容沙尘暴的搞笑句子。2.北风怒号,像一匹脱缰的烈马卷着杂物在半空里肆虐,打到脸上像鞭子抽一样疼,但是你的一句话

    生活 2021年10月25日