本文参考慕课网相关视频和博客https://mp.weixin.qq.com/s/tV0MfDdJqGwGMHCIkqnAgA,图也是这个博客的,这篇只是自己的简单总结,想要深

入理解可以访问这两块内容

内存模型定义

  java memory model(简称JMM),这是一个抽象的概念,不是真实存在的。它是一种规范一个线程对共享变量的修改对另一个线程是可见的。

为了了解java内存模型,需要先了解下面的内容。

CPU多级缓存

  随着CPU的发展,其频率太快了,主存无法跟上,这样导致CPU需要等待主存,大大浪费资源。所以为了解决CPU和主存之间速度不匹配的情况,

在二者之间出现了缓存。CPU能力不断提升,一层缓存往往无法满足要求,逐渐衍生出多级缓存。CPU缓存可以分为一级缓存(L1),二级缓存(L2),

部分高端CPU还具有三级缓存(L3),每一级缓存中所储存的全部数据都是下一级缓存的一部分。

  单核CPU只含有一套L1,L2,L3缓存

  多核CPU,则每个核心都含有一套L1(甚至和L2)缓存,而共享L3(或者和L2)缓存。

缓存一致性问题MESI:可见性问题

  在CPU和主存之间增加缓存,在多线程场景下就可能存在缓存一致性问题,也就是说,在多核CPU中,每个核的自己的缓存中,关于同一个数据

的缓存内容可能不一致。缓存一致性协议保证多个CPU cache之间缓存共享数据的一致性

                    

乱序执行优化(原子性)、指令重排(有序性)

  CPU为了提高处理速度对代码执行顺序做出改变顺序的优化

  很多编程语言的编译器也会有类似的优化,比如Java虚拟机的即时编译器(JIT)也会做指令重排。

java内存模型:Java Memory Model简称JMM

  它是一种规范,规定了jvm和计算机内存如何协同工作的,一个线程如何和何时得到别的线程修改过后的共享变量的值,如何同步的访问共享

变量

  所有的变量都存储在主内存中,每条线程还有自己的工作内存(不是真实存在的),保存了该线程中是用到的变量的主内存副本拷贝,线程对

变量的所有操作都必须在工作内存中进行,而不能直接读写主内存。不会有线程安全的问题。不同的线程之间也无法直接访问对方工作内存中的变

量,线程间变量的传递均需要自己的工作内存和主存之间进行数据同步进行。

主内存

  Java 内存模型规定了所有变量都存储在主内存(Main Memory)中(此处的主内存与介绍物理硬件的主内存名字一样,两者可以互相类比,但此

处仅是虚拟机内存的一部分)。

工作内存

  每条线程都有自己的工作内存(Working Memory,又称本地内存,可与前面介绍的处理器高速缓存类比),线程的工作内存中保存了该线程使用

到的变量的主内存中的共享变量的副本拷贝。

JMM抽象示意图如下:

两个线程中去通信一定要经过主存

步骤:线程A要将本地内存A操作过后的共享变量刷新到主存中,线程B到主存中去读取更新过后的共享变量

通过下面的操作来保证同步:

lock、unlock、read、load、use、assign、store、write

所以我们需要通过某些措施保证同步,线程同步需要满足:原子性、可见性、有序性,线程安全在下一篇文章中描述

java虚拟机(七)--java内存模型JMM的更多相关文章

  1. Java虚拟机学习 - 体系结构 内存模型

    一:Java技术体系模块图 二:JVM内存区域模型 1.方法区 也称"永久代” .“非堆”, 它用于存储虚拟机加载的类信息.常量.静态变量.是各个线程共享的内存区域.默认最小值为16MB,最 ...

  2. Java虚拟机学习 - 体系结构 内存模型(1)

    一:Java技术体系模块图 二:JVM内存区域模型 1.方法区 也称"永久代" ."非堆",  它用于存储虚拟机加载的类信息.常量.静态变量.是各个线程共享的内 ...

  3. Java虚拟机学习 - 体系结构 内存模型(转载)

    一:Java技术体系模块图 二:JVM内存区域模型 1.方法区 也称"永久代” .“非堆”,  它用于存储虚拟机加载的类信息.常量.静态变量.是各个线程共享的内存区域.默认最小值为16MB, ...

  4. 深入理解Java虚拟机(一)——JVM内存模型

    文章目录 程序计数器 定义 作用 特点 Java虚拟机栈 定义 特点 本地方法栈 定义 Java堆 定义 特点 方法区 定义 特点 运行常量池 直接内存 总结 Java虚拟机的内存空间分为五个部分: ...

  5. 【java虚拟机】jvm内存模型

    作者:pengjunlee原文链接:https://blog.csdn.net/pengjunlee/article/details/71909239 目录 一.运行时数据区域 1.程序计数器 2.J ...

  6. java内存模型(JMM)和happens-before

    目录 重排序 Happens-Before 安全发布 初始化安全性 java内存模型(JMM)和happens-before 我们知道java程序是运行在JVM中的,而JVM就是构建在内存上的虚拟机, ...

  7. 多线程并发之java内存模型JMM

    多线程概念的引入是人类又一次有效压寨计算机的体现,而且这也是非常有必要的,因为一般运算过程中涉及到数据的读取,例如从磁盘.其他系统.数据库等,CPU的运算速度与数据读取速度有一个严重的不平衡,期间如果 ...

  8. Java内存模型JMM 高并发原子性可见性有序性简介 多线程中篇(十)

    JVM运行时内存结构回顾 在JVM相关的介绍中,有说到JAVA运行时的内存结构,简单回顾下 整体结构如下图所示,大致分为五大块 而对于方法区中的数据,是属于所有线程共享的数据结构 而对于虚拟机栈中数据 ...

  9. 来,了解一下Java内存模型(JMM)

    网上有很多关于Java内存模型的文章,在<深入理解Java虚拟机>和<Java并发编程的艺术>等书中也都有关于这个知识点的介绍.但是,很多人读完之后还是搞不清楚,甚至有的人说自 ...

随机推荐

  1. js 对有“命名空间”的表单做深度解析

    问题描写叙述:一个大表单中,可能包括几十个字段.这些字段在数据库中的映射非常可能不在一张表中,为了降低后台操作的工作量,我们应该在前台提交的时候对数据做初步处理. 举例说明: watermark/2/ ...

  2. python any and all function

    1 any 如果iterable object至少有一个元素是true的时候,返回为true.空的iterable object返回为false. 2 all 如果iterable object中的每 ...

  3. 加载jQuery库

    使用google <head> <script type="text/javascript" src="http://ajax.googleapis.c ...

  4. 【Codevs 4672】辛苦的老园丁

    http://codevs.cn/problem/4672/ 那个一看这不是(最大独立集)的最大权值和,类似 反图→ 最大团  NP问题 搜索解决 改一下模板即可 参考最大独立集  Maximum C ...

  5. csdn 去除广告

    下载 Adblock Plus  下载地址:https://adblockplus.org/ 下载后安装即可.

  6. POJ1389 Area of Simple Polygons 线段树

    POJ1389 给定n个整数点矩形,求面积并. 显然ans必然是整数. 记录若干个事件,每个矩形的左边的竖边记为开始,右边的竖边记为结束. 进行坐标离散化后用线段树维护每个竖的区间, 就可以快速积分了 ...

  7. 杂项:MySQL

    ylbtech-杂项:MySQL 1.返回顶部   2.返回顶部   3.返回顶部   4.返回顶部   5.返回顶部 0. https://www.mysql.com/ 1. https://bai ...

  8. Real-Time Compressive Tracking,实时压缩感知跟踪算法解读

    这是Kaihua Zhang发表在ECCV2012的paper,文中提出了一种基于压缩感知(compressive sensing)的单目标跟踪算法,该算法利用满足压缩感知(compressive s ...

  9. java笔记线程方式1线程终端与停止

    public final void stop():让线程停止,过时了,但是还可以使用.public void interrupt():中断线程. 把线程的状态终止,并抛出一个InterruptedEx ...

  10. 双栈排序 2008年NOIP全国联赛提高组(二分图染色)

    双栈排序 2008年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 大师 Master     题目描述 Description Tom最近在研究一个有 ...